Dichiarazioni
typedef struct nodo { int info; struct nodo *sx, *dx; } NODO; typedef NODO *ptree;
Operazioni
Aggiungere un nodo
Se l’informazione è già contenuta nell’albero non sarà inserita
void add_nodo(ptree *p, int N) { if((*p) == NULL) { (*p)=(ptree)malloc(sizeof(NODO)); (*p)->info=N; (*p)->sx=NULL; (*p)->dx=NULL; } else if(N < (*p)->info) add_nodo(&((*p)->sx), N); else if(N > (*p)->info) add_nodo(&((*p)->dx), N); }
Ricerca di un nodo
Restituisce il puntatore al nodo con l’informazione data
pnodo ric_nodo(ptree p, int N) { if(p == NULL) return NULL; else if(N < p->info) return ric_nodo(p->sx, N); else if(N == p->info) return p; else return ric_nodo(p->dx, N); }
Visita
L’output sarà ordinato…
void inorder(ptree p) { if(p != NULL) { inorder(p->sx); printf("%d ", p->info); inorder(p->dx); } }
Se sono ammessi valori ripetuti è utile aggiungere un contatore in ogni nodo
Dichiarazioni
typedef struct nodo { int info; int conta; struct nodo *sx, *dx; } NODO; typedef NODO *ptree;
Operazioni
Aggiungere un nodo
Se l’informazione è già contenuta nell’albero si incrementa il contatore
void add_nodo(ptree *p, int N) { if((*p) == NULL) { (*p)=(ptree)malloc(sizeof(NODO)); (*p)->info=N; (*p)->conta=1; (*p)->sx=NULL; (*p)->dx=NULL; } else if(N < (*p)->info) add_nodo(&((*p)->sx), N); else if(N == (*p)->info) (*p)->conta +=1; else add_nodo(&((*p)->dx), N); }
Ricerca di un nodo
Restituisce il contatore
int ric_nodo(ptree p, int N) { if(p == NULL) return 0; else if(N < p->info) return ric_nodo(p->sx, N); else if(N == p->info) return p->conta; else return ric_nodo(p->dx, N); }
Visita
void inorder(ptree p) { if(p != NULL) { inorder(p->sx); printf("%d %d\n", p->info, p->conta); inorder(p->dx); } }