Non riesco a comprendere la definizione di una funzione.
Ecco l'esercizio:
Dato un albero di ricerca binario,
Scrivere una funzione ricorsiva che effettui una visita simmetrica e che stampi il valore di ogni nodo dell'albero.
Due note:
La visita simmetrica è una visita ordinata in tal modo:
1) figli sinistri;
2) radice;
3) figli destri.
Ogni nodo dell'albero è siffatto:
- Codice:
struct btree{
float value;
struct btree * left_ptr;
struct btree * right_ptr;
}
Qui sotto scrivo la definizione della funzione che non riesco a capire
- Codice:
void visit_r(struct btree * ptr){
/*function which takes in input a pointer to struct btree*/
- Codice:
if (ptr != NULL) { /*if the pointer points to something*/
printf("I search the left son... ");
visit_r(ptr->left_ptr);
/*I can't understand what happens here. I re-use my
function with a new input, but I will give a new input
until pointer==NULL.
When pointer will be == NULL, I will not
enter in the "if cycle", and I will not be able
to print the value of my nodes!*/
- Codice:
printf("\n I print the value: %f \n", ptr->value);
printf("I search the right son... ");
visit_r(ptr->right_ptr);
} printf("Let's go back... ");
}
/*I can't understand neither how it can go back,
how it can 'climb' the tree*/
Essendo una funzione ricorsiva, quando si raggiunge la riga dove vi è scritto visit_r(ptr->left_ptr); , si ritorna alla prima riga effettuando la visita con un nuovo input.
Tuttavia ancora non riesco a capire come faccia a funzionare.
Tale procedimento verrà re-iterato finchè 'ptr->left_ptr' non sarà uguale a NULL,
ma quando 'ptr->left_ptr' sarà ' == NULL', non potrò entrare nel ciclo "if(...)" e non sarò in grado di stampare i miei valori!
Inoltre non capisco come, a fine ciclo, si possa "risalire" nell'albero..
P.s. il codice è scritto da una professoressa universitaria, i commenti sono scritti da me.
Grazie a tutti!