[C] Funzione che trasferisca foglie di un albero binario in una lista

desterix95
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:
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
insideworld
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:
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;

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.