Académique Documents
Professionnel Documents
Culture Documents
Introduzione
A
B
E
F
G
I
H
L
Terminologia
n nodo si dice foglia se non ha figli. I nodi che non sono foglie
sono detti nodi interni. Nell'esempio precedente, sono foglie i
nodi F, I, M e N.
E' possibile stabilire dei legami di parentela tra i nodi, del tutto simili
a quelli della vita reale: la radice il padre o genitore dei due nodi a
lui connessi, che quindi saranno suoi figli. I figli di uno stesso genitore
sono fratelli. Allo stesso modo si possono stabilire i legami di
parentela nonno, zio ecc
Ogni nodo di un albero ha un solo genitore e, nel caso degli alberi
binari, al massimo due figli.
Un albero binario si dice pieno se sono
contemporaneamente queste condizioni:
1. Tutte le foglie hanno lo stesso livello
2. Tutti i nodi interni hanno esattamente 2 figli
soddisfatte
Attraversamenti
Ordine anticipato
Se l'albero binario non vuoto:
1. Visito la radice
2. Attraverso il sottoalbero sinistro in ordine anticipato
3. Attraverso il sottoalbero destro in ordine anticipato
Ordine posticipato
Se l'albero binario non vuoto:
1. Attraverso il sottoalbero sinistro in ordine posticipato
3
Va notato che le tre visite differiscono solo nel fatto che viene
alterato l'ordine di visita dei sottoalberi e della radice.
Riferendosi all'albero di Figura 1, ecco come risultano le visite.
ANTICIPATA: ABDFCEGIHLMN
POSTICIPATA: FDBIGMNLHECA
SIMMETRICA: DFBACIGEMLNH
10
5
11
8
15
9
20
18
In modo intuitivo si pu capire come una struttura dati del genere sia
particolarmente indicata per inserimenti ordinati e per la ricerca di tipo
dicotomico (che viene anche detta binaria).
Una particolare propriet dei BST che la visita simmetrica fornisce
gli elementi esattamente in ordine crescente.
SIMMETRICA:
5 6 7 8 9 10 11 15 18 20
Un esempio pratico
if (n == 0)
return 1;
return n * fattoriale_ricorsivo (n 1);
}
Tecniche di ricorsione
Abbiamo visto un esempio di procedura ricorsiva, dimostrando
"brutalmente" il suo funzionamento. Adesso, tuttavia, bene
riorganizzare il tutto e descrivere i punti fondamentali della
ricorsione, da seguire sempre quando si scrive una procedura
ricorsiva:
1. La procedura deve risolvere manualmente almeno un caso
base.
2. La procedura deve essere chiamata ricorsivamente con
parametri che convergono sempre di pi verso il caso base. In
generale, la procedura deve essere sempre richiamata con
parametri sempre pi piccoli.
3. Deve essere possibile la convergenza insiemistica.
Se si verificano queste tre condizioni, siamo sicuri che la nostra
procedura ricorsiva terminer.
10
11
4. Algoritmi di base
Stampa di un albero binario
f(x) viene salvato come nuovo valore del nodo, quindi la funzione
Notare che questa funzione non necessita del supporto di alcun ciclo:
per la corretta lettura dell'albero, saranno sufficienti le istruzioni.
// Creo l'albero vuoto
albin root;
imposta_radice (&root, albero_vuoto());
// Lettura albero binario
imposta_radice (&root, creaAB(root));
5 4 3 . . 5 . . 6 . 9 7 . . 2
4
3
. .
6
5
9
7
17
19