[C] Funzione che trasferisca foglie di un albero binario in una lista
Buonasera, ho provato a scrivere una funzione che trasferisca le foglie di un albero binario in una lista e volevo sapere se può andare bene:
Mi interessa anche capire se va bene la parte dell'else, nella quale entro se l'elemento dell'albero non ha entrambi i figli nulli, cioè non è una foglia; se questo elemento ha il figlio destro nullo, allora fai la funzione nel sottoalbero sinistro, viceversa se ha il figlio sinistro nullo.
Grazie
void Funzione(struct btree **ptrptr, struct list **tmptmp) { if ((*ptrptr) != NULL) { init(tmptmp); // inizializzo tmptmp, la nuova lista if (((*ptrptr)->left_ptr == NULL) && ((*ptrptr)->right_ptr == NULL)) { pre_insert(tmptmp,(*ptrptr)->value); //inserisco foglie nella nuova lista } else { if ((*ptrptr)->left_ptr == NULL) { Funzione((*ptrptr)->right_ptr, tmptmp); } if ((*ptrptr)->right_ptr == NULL) { Funzione((*ptrptr)->left_ptr,tmptmp); } } } }
Mi interessa anche capire se va bene la parte dell'else, nella quale entro se l'elemento dell'albero non ha entrambi i figli nulli, cioè non è una foglia; se questo elemento ha il figlio destro nullo, allora fai la funzione nel sottoalbero sinistro, viceversa se ha il figlio sinistro nullo.
Grazie
Risposte
la lista la devi inizializzare nel main o in una funzione a parte detta di cornice. questa funzione di cornice si preoccupa in questo caso di creare la lista e di chiamare per la prima volta la funzione ricorsiva vera e propria, eventualmente facendo ad esempio il controllo sulla correttezza dei dati inseriti prima di passarli alla funzione ricorsiva.
io la farei in questo modo:
probabilmente avrai problemi per l'aggiungere elementi in una lista, perchè o hai una lista implementata a parte, tipo "object oriented" o dovrai aggiungere il parametro di ritorno al nodo da aggiungere della lista, che verrà aggiornato col campo next del nodo appena creato.
io la farei in questo modo:
if(controllo che il nodo attuale sia uguale a null){ return; } //se sono arrivato qui significa che il nodo corrente è un nodo utile quindi lo aggiungo alla lista ricorro a destra; ricorro a sinistra; return;
probabilmente avrai problemi per l'aggiungere elementi in una lista, perchè o hai una lista implementata a parte, tipo "object oriented" o dovrai aggiungere il parametro di ritorno al nodo da aggiungere della lista, che verrà aggiornato col campo next del nodo appena creato.
if(controllo che il nodo attuale sia uguale a null){ return (campo del puntatore alla lista attuale); } //se sono arrivato qui significa che il nodo corrente è un nodo utile quindi lo aggiungo alla lista aggiungo alla lista; ricorro a destra;(passo come parametro alla lista il campo next del nodo qui sopra) ricorro a sinistra;(passo come parametro alla lista il valore tornato dalla funzione che ricorre a destra) return del valore tornato dalla funzione che ricorre a sinistra) return;