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

Messaggioda desterix95 » 24/06/2017, 16:41

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:
Codice:
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
desterix95
Junior Member
Junior Member
 
Messaggio: 61 di 222
Iscritto il: 10/07/2015, 14:37

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

Messaggioda insideworld » 24/06/2017, 20:31

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:
Codice:
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.
Codice:
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;
Avatar utente
insideworld
Junior Member
Junior Member
 
Messaggio: 111 di 306
Iscritto il: 13/01/2017, 15:24


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite