Appunti per il modulo di algoritmi e strutture dati - Sezione di ...
Appunti per il modulo di algoritmi e strutture dati - Sezione di ...
Appunti per il modulo di algoritmi e strutture dati - Sezione di ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
❄<br />
E<br />
❄<br />
❄<br />
❄<br />
B C D<br />
❄<br />
F<br />
A<br />
0 0 0 0 0 0<br />
❄<br />
G<br />
0 0 0 0 0 0 0 0 0<br />
Figura 8: La memorizzazione M1 dell’albero in figura 6<br />
Riconsideriamo l’albero or<strong>di</strong>nato <strong>di</strong> figura 6 e la sua memorizzazione figlio-fratello, mostrata in figura<br />
9. È fac<strong>il</strong>e rendersi conto che, applicando preorder otteniamo la linearizzazione dell’albero secondo<br />
l’or<strong>di</strong>ne anticipato, anche se la funzione non è definita con gli stessi casi della definizione <strong>di</strong> albero<br />
generico ( preorder ha come caso base l’albero vuoto, che non è un albero generico, mentre <strong>il</strong> caso base<br />
della definizione è l’albero composto da un solo nodo). Per ottenere la linearizzazione <strong>di</strong>fferita dell’albero,<br />
è fac<strong>il</strong>e rendersi conto che possiamo ut<strong>il</strong>izzare la visita simmetrica. Infatti, adottando la memorizzazione<br />
figlio-fratello, è come se avessimo “trasformato” l’albero in un albero binario, con la proprietà che<br />
• la visita <strong>di</strong>fferita dell’albero corrisponde alla visita simmetrica del trasformato.<br />
Quin<strong>di</strong> <strong>il</strong> tempo delle visite in un albero generico è lineare nel numero dei no<strong>di</strong>. Per quanto riguarda la<br />
ricerca, l’inserimento e la cancellazione <strong>di</strong> un nodo, <strong>il</strong> tempo è comunque lineare. Infatti queste o<strong>per</strong>azioni<br />
possono essere programmate mantenendo la struttura delle visite.<br />
Supponiamo ora <strong>di</strong> voler calcolare la complessità delle visite prendendo come <strong>di</strong>mensione i livelli<br />
dell’albero. Abbiamo<br />
T (0) = a<br />
T (n) = 2T (n − 1) + b n > 1<br />
Infatti se l’albero ha livello 0, cioè è composto dalla sola ra<strong>di</strong>ce, <strong>il</strong> tempo è costante: se l’albero ha n<br />
livelli, <strong>il</strong> tempo è un tempo costante <strong>per</strong> la visita della ra<strong>di</strong>ce più <strong>il</strong> tempo <strong>di</strong> visita <strong>di</strong> due sottoalberi,<br />
ognuno con al massimo n − 1 livelli. Se risolviamo la relazione, ve<strong>di</strong>amo che T (n) è O(2 n ), che è un<br />
tempo esponenziale (la relazione <strong>di</strong> ricorrenza è lineare).<br />
7.2 Esempi <strong>di</strong> programmi su alberi generici<br />
Consideriamo la memorizzazione figlio-fratello. La funzione seguente conta le foglie <strong>di</strong> un albero generico.<br />
Si noti la <strong>di</strong>fferenza con la funzione, definita nella sezione 6.2 che conta le foglie <strong>di</strong> un albero binario:<br />
mentre in un albero binario una foglia ha entrambi i sottoalberi vuoti, in un albero generico, se un nodo<br />
ha <strong>il</strong> campo left a NULL, allora non ha nessun figlio, cioè è una foglia.<br />
36