[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;