Il modo migliore per capire come funziona la ricorsione è fare tre cose:codice:void inorder (BTREE root) { if (root != NULL) { inorder (root ->left); printf("%c", root-> d); inorder(root -> right); } }
-Tenere presente che ogni invocazione della funzione è dal punto di vista del pc esattamente come la chiamata ad un'altra funzione qualunque
-Tenere presente che esiste uno stack di sistema in cui vengono accumulate le chiamate a funzione(spero chr tu sappia cos'è uno stack o pila)
-Provare a simulare passo passo con un caso semplice
Ad esempio supponi di avere un albero a tre nodi (supponiamo che DATA sia una stringa) con radice Carlo, figlio sinistro della radice Bruno, figlio destro Marco.
LA prima chiamata alla funzione sarà fatta dalla main con argomento la radice dell'albero (Carlo), il conrollo if (root != null) non fallisce (altrimenti l'albero sarebbe vuoto).La prossima istruzione richiama la funzione stessa con argomento il figlio sinistro di Carlo (Bruno), quello che succede è che La chiamata che si sta occupando di carlo viene sospesa cioè salvata nello stack (viene salavata anche la posizione attuale del "cursore di esecuzione").La chiamata che gestisce bruno trova ancora che il test non fallisce ed esegue la prima istruzione che è quella di fare una chiamata col figlio sinistro di bruno (NULL).La chiamata per bruno viene anch'essa salavata sullo stack (sopra carlo quindi ne verrà estratta prima).La chiamata che gestisce il NULL figlio sinistro di Bruno ritorna subito perchè il controllo fallisce.Allora la chiamata che gestisce bruno viene ripescata dallo stack e si riparte da dove la si era lasciata esguendo la prossima istruzione (chhe stampa Bruno su schermo) e la successiva che è dinuovo una chiamata con argomento NULL e ritorna subito.Ora anche la chiamata a Bruno è finita e si torna ad eseguire la prossima istruzione di carlo (la pintf).Non credo ci sia bisogno di continuare, dovrebbe essere chiaro come si svolge il tutto.