|
!t significa che ti hanno passato un albero vuoto (il puntatore vuoto è NULL cioè 0), quindi !t significa se l'albero è vuoto...
Stessa cosa per if(t->dx) e if(t->sx) esegue quella chiamato solo i puntatori ai figli di sinistra e di destra contengono un elemento...
Quegli if potrebero essere omessi, anzi nella forma canonica della ricorsione andrebbero omessi perchè la condizione d'arresto è if(!t) iniziale... Ce l'ho messi perchè, visto che in ogni chiamata si spreca heap, risparmiare un po' di risorse ed essere + veloci...
Infatti se omettevo i due if avrebbe pensato la condizione di arresto a ritornare valori comunque validi per la nostra ricorsione...
In questo modo la condizione di arresto non può comunque essere omessa perchè se ti passano un albero vuoto dobbiamo comunque ritornare 0 e 0...
Ti insegno il trucco per le ricorsione...non pensare a come deve funzionare il problema globalmente altirmenti non riuscirai mai a scrivere la ricorsione.
Inizia con la condizione di arresto che in tutti i casi deve essere presente (solitamente si controlla se il puntatore passato è vuoto)...
Dopo passa al nodo/elemento precedente a quello di aresto e scrivi come dovrebbe lavorare la funzione con quell'elemento che riceve i risultati dal/dagli elemento/i nulli...
A questo punto hai già finito...
Fai una prova con due elementi per le liste e con un albero assimmetrico con due elemnti per gli alberi binari (una radice con un solo figlio)...ed ecco finito tutto !!!
|