Allora. E' sufficiente (ed anche molto più elegante) che fai così:
Riutilizzi la funzione insert(). Infatti poichè i valori che tu gli passi sono, per la natura stessa dell'albero, crescenti, il risultato sarà un albero sbilanciato a destra.codice:#include<stdio.h> #include<stdlib.h> typedef struct btree_tag{ int value; struct btree_tag *left; struct btree_tag *right; }btree; void insert(btree* *btpp, int x) { while(*btpp!=NULL) if((*btpp)->value>x)btpp=&((*btpp)->left); else btpp=&((*btpp)->right); *btpp=(btree*)malloc(sizeof(btree)); (*btpp)->value=x; (*btpp)->left=NULL; (*btpp)->right=NULL; } void sbilancia(btree* *new_root, btree *btp) { if(btp!=NULL) { sbilancia(new_root,btp->left); insert(new_root, btp->value); sbilancia(new_root,btp->right); } } void visita(btree *pnodo) { if(pnodo) { printf("%d ",pnodo->value); visita(pnodo->left); visita(pnodo->right); } } void main(){ btree *albero=NULL; btree *nuovo=NULL; /* VALORI NODI ALBERO */ int valnodi[9]={35,23,40,10,28,37,48,25,26}; int i; for(i=0;i<9;i++)insert(&albero,valnodi[i]); printf("\n\n"); sbilancia(&nuovo,albero); visita(nuovo); getch(); }
In alternativa:
Questo qui invece non usa la funzione insert().codice:#include<stdio.h> #include<stdlib.h> typedef struct btree_tag{ int value; struct btree_tag *left; struct btree_tag *right; }btree; void sbilancia(btree* *new_root, btree *btp) { if(btp!=NULL) { sbilancia(new_root,btp->left); while(*new_root) new_root=&((*new_root)->right); (*new_root)=(btree*)malloc(sizeof(btree)); (*new_root)->value=btp->value; (*new_root)->left=NULL; (*new_root)->right=NULL; sbilancia(new_root,btp->right); } } void insert(btree* *btpp, int x) { while(*btpp!=NULL) if((*btpp)->value>x)btpp=&((*btpp)->left); else btpp=&((*btpp)->right); *btpp=(btree*)malloc(sizeof(btree)); (*btpp)->value=x; (*btpp)->left=NULL; (*btpp)->right=NULL; } void visita(btree *pnodo) { if(pnodo) { printf("%d ",pnodo->value); visita(pnodo->left); visita(pnodo->right); } } void main() { btree *albero=NULL; btree *nuovo=NULL; /* VALORI NODI ALBERO */ int valnodi[9]={35,23,40,10,28,37,48,25,26}; int i; for(i=0;i<9;i++)insert(&albero,valnodi[i]); printf("\n\n"); sbilancia(&nuovo,albero); visita(nuovo); getch(); }
Comunque l'errore consisteva nel fatto che, poichè nella ricorsione dereferenziavi il puntatore new_root, praticamente ti spostavi lungo l'albero (andando sempre verso destra) mentre immettevi i valori, per cui alla fine la tua "root" puntava all'ultimo elemento dell'albero.

Rispondi quotando