Salve ragazzi la traccia dell'esercizio è questa:
Partendo da un ABR,devo costruire un altro albero che abbia gli stessi nodi ma con l'aggiunto di un nodo in mezzo(deve essere una foglia) che abbia come chiave la media del nodo sinistro e del nodo destro della radice
Il problema è che quando faccio la visita in order dell'albero ternario senza considerare il nodo centrale, mi stampa indirizzi di memoria
definizione strutture:
struct tree{
struct tree *right;
struct tree *left;
int x;
};
struct ternario{
struct ternario *right;
struct ternario *left;
struct ternario *centr;
int x;
};
funzioni:
struct tree *crea(int x){
struct tree *e=(struct tree *)malloc(sizeof(struct tree));
e->x=x;
e->left=NULL;
e->right=NULL;
return e;
};
struct tree *insordine(struct tree *albero,int x){
if (albero==NULL){
albero=crea(x);
}
else{
if(albero->x>x)
albero->left=insordine(albero->left,x);
else if(albero->x<x)
albero->right=insordine(albero->right,x);
}
return albero;
};
void inorder(struct tree *albero){
if(albero!=NULL){
inorder(albero->left);
printf("%3d",albero->x);
inorder(albero->right);
}
}
struct ternario *crea2(int x,struct tree *albero){//mi creo una struttura di tipo ternario e la "incollo" nella radice
struct ternario *e=(struct ternario *)malloc(sizeof(struct ternario));
e->x=x;
if(albero->left!=NULL && albero->right != NULL)
e->centr=(albero->left->x+albero->right->x)/2;
else
e->left=NULL;
e->right=NULL;
return e;
};
struct ternario *costruisci_ternario(int x,struct ternario *radice,struct tree *albero){// è un semplice inserimento in un ABR mi prendo il nodo dell'albero binario per inserirlo nel ternario
if(radice==NULL)
radice=crea2(x,albero);
else{
if(x>radice->x)
radice->right=costruisci_ternario(x,radice->right,albero);
else if(x<radice->x)
radice->left=costruisci_ternario(x,radice->left,albero);
}
return radice;
};
struct ternario *prova(struct tree *albero,struct ternario *radice){//visita dell' alber binario mi prendo ogni suo nodo e lo passo alla funzione costruisci ternario
if(albero!=NULL){
radice=costruisci_ternario(albero->x,radice,albero);
radice=prova(albero->left,radice);
radice=prova(albero->right,radice);
}
return radice;
};
main
int main()
{
struct tree *albero=NULL;
int i=0;
for(i=0;i<10;i++){
albero=insordine(albero,i);
}
inorder(albero);
struct ternario *radice=NULL;
radice=prova(albero,radice);
printf("\n");
inorder(radice);
return 0;
}