View Full Version : [C] funzione ricorsiva che copia gli elementi di un albero binario in un vettore
Salve a tutti. Ho il seguente problema: devo copiare gli elementi di un albero binario di ricerca in un vettore ordinato in maniera crescente ricorsivamente.
void copia(int vet[max],nod *rad, int i)
{
if (rad!=NULL)
{
copia(vet,rad->sinistro,i);
vet[i]=rad->info;
i=i+1;
copia(vet,rad->destro,i);
}
}
dove max e una costante rad il puntatore dell albero e i l indice del vettore.
L OUTPUT mi copia solo i figli di destra.
:mc: Spero qualcuno mi aiuti!!!!!
immagino che tu chiami con i = 0, no?
ora, quando arrivi la prima volta alla linea
copia(vet,rad->sinistro,i);
ora, metti che abbia fatto tutte le chiamate ricorsive del sottoalbero sinistro, non sai quanti elementi ha scritto nel vettore, però tu scrivi, nella riga successiva, nella posizione 0 il valore dell'elemento corrente, probabilmente già hai sovrascritto qualcosa, e continua così..
visto che la chiamata non ritorna nulla, potresti ritornare il numero di elementi già inseriti nell'array, così da poter capire dove devi scrivere il prossimo numero
si lo chiamo con i=0.
Se ho ad esempio l albero semplice
4
2 6
cioe con 4 nodo radice , 2 figlio sinistro di 4 e 6 figlio destro di 4.
nel vettore metterà solo 4 e 6.
forse non hai notato, ma ti ho detto sia il perché sia una possibile soluzione :X
Stai sovrascrivendo tutti i valori, se passi lo stesso puntatore "vet" alle due funzioni (prima sx e poi dx) seconda sovrascrivera` quello scritto dalla prima...
non so come altro fare. mi aiutate???
qwerty86
13-01-2011, 21:31
void copia(int vet[max],nod *rad, int i)
{
if (rad!=NULL)
{
copia(vet,rad->sinistro,i);
vet[i]=rad->info;
copia(vet,rad->destro,i+1);
}
}
prova così....
e che cambia?
ps: ripeto, te l'ho detto come puoi fare :asd:
qwerty86
13-01-2011, 22:00
e che cambia?
ps: ripeto, te l'ho detto come puoi fare :asd:
cambia che nella seconda chiamata incrementa i
cambia che nella seconda chiamata incrementa ie quello che aveva scritto lui no?
il punto è che non risolve il problema
qwerty86
13-01-2011, 22:10
e quello che aveva scritto lui no?
il punto è che non risolve il problema
Ops...sono fuso! Hai ragione..si mi sa che la tua è una buona soluzione..
void copia(int vet[max],nod *rad, int i)
{
if (rad!=NULL)
{
copia(vet,rad->sinistro,i);
vet[i]=rad->info;
copia(vet,rad->destro,i+1);
}
}
prova così....
A me risulta sbagliato pure questo... I figli a sinistra sovrascrivono comunque la entry del padre no?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.