esercizi alberi binari int num NodiTree Ptr t
esercizi alberi binari int num. Nodi(Tree. Ptr t. Ptr) /* Postc: restituisce il numero dei nodi di t. Ptr */ {if (!t. Ptr ) return 0; return num. Nodi(t. Ptr->left) + num. Nodi(t. Ptr->right) + 1; } int alt(Tree. Ptr t. Ptr) /* Postc: restituisce l’altezza di t. Ptr */ {if (!t. Ptr ) return -1; return max(alt(t. Ptr->left), alt(t. Ptr->right)) + 1; } 1
Versione “quasi tail recursive”, : il calcolo del numero dei nodi void num. Nodi 2(Tree. Ptr t. Ptr, int* num) /* num inizialmente deve esser 0 Postc: calcola in num il numero dei nodi di t. Ptr */ {if (!t. Ptr ) return; (*num)++; num. Nodi 2(t. Ptr->left, num); num. Nodi 2(t. Ptr->right, num); } N. B. “quasi tail recursive” è qui usato per identificare il caso in cui la funzione non ha chiamate in sospeso i cui valori devono essere combinati all’uscita. Per la versione iterativa equivalente serve comunque la gestione di una pila 2
Versione “quasi tail recursive”: il calcolo dell’altezza void alt 2(Tree. Ptr t. Ptr, int liv, int *altmax) /* inizialmente liv = 0 e *altmax =-1; Postc: calcola in altmax l’altezza di t. Ptr */ { if (!t. Ptr) return; if (foglia(t. Ptr)) *altmax = max(*altmax, liv); alt 2(t. Ptr->left, liv+1, altmax); alt 2(t. Ptr -> right, liv+1, altmax); } 3
le funzioni ausiliarie int max(int n, int m); int max(int n, int m) {if (n<m) return m; else return n; } int foglia(Tree. Ptr t. Ptr); int foglia(Tree. Ptr t. Ptr) { if (!t. Ptr ->left && !t. Ptr->right) return 1; else return 0; } 4
- Slides: 4