PDA

View Full Version : [C] funzione ricorsiva che copia gli elementi di un albero binario in un vettore


mame83
10-01-2011, 18:26
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!!!!!

tuccio`
10-01-2011, 18:57
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

mame83
11-01-2011, 16:52
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.

tuccio`
11-01-2011, 19:45
forse non hai notato, ma ti ho detto sia il perché sia una possibile soluzione :X

Ufo13
11-01-2011, 20:03
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...

mame83
13-01-2011, 17:37
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ì....

tuccio`
13-01-2011, 21:52
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

tuccio`
13-01-2011, 22:06
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..

Ufo13
14-01-2011, 18:24
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?