Ho un problema con una procedura di sbilanciamento per alberi binari.
Devo realizzare una funzione che riceve in input un albero binario di ricerca in cui a ciascun nodo è associato un valore intero.
La funzione deve restituire in output un nuovo albero binario di ricerca con lo sbilanciamento massimo; cioè con soli discendenti destri.
Il codice che ho scritto è il seguente:
#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);
if(*new_root){
(*new_root)->right=(btree*)malloc(sizeof(btree));
*new_root=(*new_root)->right;
}else (*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();
}
eseguendo questo codice ottengo solo la visualizzazione del valore 48 mentre dovrei ottenere la visualizzazione della successione:
10 -> 23 -> 25 -> 26 -> 28 -> 35 -> 37 -> 40 -> 48 (cioè tutti i valori dei nodi destri del nuovo albero).
Dove sbaglio?
Io credo ci sia un problema nel valore di ritorno di new_root, ma non sono sicuro.
Forse sbaglio a richiamare la funzione???
Sapete come aiutarmi????