Allora. E' sufficiente (ed anche molto più elegante) che fai così:
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();
}
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.
In alternativa:
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();
}
Questo qui invece non usa la funzione insert().
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.