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????