1© Alberto Montresor
Algoritmi e Strutture DatiCapitolo 5 - Alberi
Alberto MontresorUniversità di Trento
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.
2© Alberto Montresor
Alberi radicatiAlberi radicati
✦Albero: definizione informale
✦E' un insieme dinamico i cui elementi hanno relazioni di tipo gerarchico
✦Albero: definizione ricorsiva
✦Insieme vuoto di nodi, oppure
✦Una radice T e 0 o più sottoalberi, con la radice di ogni sottoalbero collegata a T da un arco (orientato)
T1 T2 Tn
T
es.: radice T con n sottoalberi
3© Alberto Montresor
Alberi ordinatiAlberi ordinati
T
j k
a
Radice (root)
Sottoalbero
Figlio (child) di T
Figlio di T
Radice del proprio
sottoalbero
Foglie (leaf)
Nodi fratelli
(figli di a)
Nodi interni =
Nodi - Foglie
...
Padre (parent)
dei nodi j e k
4© Alberto Montresor
Alberi: definizioniAlberi: definizioni
✦In un albero
✦Profondità di un nodo: la lunghezza del percorso dalla radice al nodo (i.e., numero archi attraversati)
✦Livello: l'insieme dei nodi alla stessa profondità
✦Altezza dell'albero: massimo livello delle sue foglie
p=0
Altezza albero: 3
p=1
p=2
p=3
Livello 3
5© Alberto Montresor
Alberi?Alberi?
DAG Radice
Foresta
6© Alberto Montresor
Alberi: una possibile specifica
7© Alberto Montresor
Algoritmi di visita degli alberi
✦Visita (o attraversamento) di un albero:
✦Algoritmo per “visitare” tutti i nodi di un albero
✦In profondità (depth-first search, a scandaglio): DFS
✦Vengono visitati i rami, uno dopo l’altro
✦Tre varianti
✦In ampiezza (breadth-first search, a ventaglio): BFS
✦A livelli, partendo dalla radice
8© Alberto Montresor
Visita alberi: in profondità in ordine anticipato (previsita)Visita alberi: in profondità in ordine anticipato (previsita)
a
b e
c d f g
Sequenza: a b c d e f g
T
9© Alberto Montresor
Visita alberi: in profondità in ordine posticipato (postvisita)Visita alberi: in profondità in ordine posticipato (postvisita)
a
b e
c d f g
T
Sequenza: c d b f g e a
10
© Alberto Montresor
Visita alberi: in profondità in ordine simmetrico (invisita)Visita alberi: in profondità in ordine simmetrico (invisita)
a
b e
c d f g
T
Sequenza (i=1): c b d a f e g
11
© Alberto Montresor
Visita alberi: in ampiezzaVisita alberi: in ampiezza
a
b e
c d f g
T
Sequenza: a b e c d f g
12
© Alberto Montresor
Realizzazione con vettore dei figliRealizzazione con vettore dei figli
/ /
/
/ / / /
/
Nodo
Padre
Array di Figli
/
/ /
/ ///////// / /
// / /
// / /
// / / // / /
/ / /
Rischio di sprecare memoria se molti nodi hanno grado minore del grado massimo k.
13
© Alberto Montresor
Realizzazione con puntatori padre/primo-figlio/fratelloRealizzazione con puntatori padre/primo-figlio/fratello
/ /
/
/ /
/
/ / / /
/ / / /
//
NodoPrimoFiglio
Padre
Fratello
Soluzione: usare una lista di figli (fratelli).
14
© Alberto Montresor
Realizzazione con puntatori padre/primo-figlio/fratello
15
© Alberto Montresor
Realizzazione con puntatori padre/primo-figlio/fratello
16
© Alberto Montresor
Realizzazione con vettore dei padriRealizzazione con vettore dei padri
a
b e
c d f g
T
✦L'albero è rappresentato da un vettore i cui elementi contengono l'indice del padre
✦Esempio: 0 a
1 b
1 e
2 c
2 d
3 f
3 g
17
© Alberto Montresor
Realizzazione con vettore dei padri
18
© Alberto Montresor
Alberi binari
✦Definizione
✦Un albero binario è un albero ordinato in cui ogni nodo ha al più due figli e
✦si fa distinzione tra il figlio sinistro ed il figlio destro di un nodo.
✦Nota:
✦due alberi T e U aventi gli stessi nodi, gli stessi figli per ogni nodo e la stessa radice, sono distinti qualora un nodo u sia designato come figlio sinistro di un nodo v in T e come figlio destro del medesimo nodo in U
19
© Alberto Montresor
Alberi binari Alberi binari
j k
a
Radice
Sottoalbero
destro
Sottoalbero
sinistro
Figlio sinistro
Radice del
sottoalbero sinistro
Figlio destro
Radice del
sottoalbero destro
j.parent()
Padre del
nodo j (e k)
a.left() a.right()
20
© Alberto Montresor
Alberi binari: specifica
21
© Alberto Montresor
Alberi binari: realizzazioneAlberi binari: realizzazione
/ / / / /
/ /
/
/ /
NodoFiglio
Sinistro
Padre
FiglioDestro
22
© Alberto Montresor
Alberi binari: realizzazione
Per motivi di spazio, le operazioni parent(), left(), right(), read() e write() non sono mostrate; semplicemente, restituiscono il valore della variabile corrispondente.
23
© Alberto Montresor
Alberi binari: visite in profondità
24
© Alberto Montresor
Limite inferiore complessità ordinamento
✦Albero delle scelte in algoritmi di ordinamento
✦Sequenze di confronti (a due alternative) rappresentabile come albero binario
✦Nodi interni → confronti, foglie → soluzioni del problema
✦Percorso radice-foglia: insieme di confronti per individuare una soluzione
✦Limite inferiore ordinamento
✦Sia n la dimensione del vettore
✦Numero di possibili soluzioni: n!
✦Altezza minima albero:log2 n!
✦Da cui deriva che qualunquealgoritmo di ordinamentorichiede Ω(n log n) confronti
25
© Alberto Montresor
Semplici esercizi basati su visite
✦Es. 5.1 - Dato un albero radicato T, calcolare la sua altezza
✦Dato un albero radicato T, calcolare il numero totale di nodi
✦Dato un albero radicato T, stampare tutti i nodi a profondità h
www.xkcd.com