Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2006-7
un albero binario completo con N vertici interni ha N+1 foglie
un albero binario completo con N vertici interni ha 2N archi: N-1 fra vertici interni e N+1 archi a foglie
definizioni:
in un albero binario completo con N vertici interni, se I è la lunghezza del cammino interno ed E è la lunghezza del cammino esterno, allora E = I + 2N
l'altezza h di un albero binario completo
con N vertici interni soddisfa: ⌊
lg N⌋
+1 ≤
h ≤
N-1
la lunghezza del cammino interno, I, di un
albero binario completo con N vertici interni
soddisfa: N lg(N/4) <
I ≤
N(N-1)/2
⌊
lg
N⌋
,
di cui almeno due di livello ⌊
lg
N⌋
+1: moltiplicando e applicando l'ultima
proprietà dalla pagina precedente si ha>
(N+1)⌊
lg
N⌋
-2N
>
N lg(N/4)
(v. esercizio 2)
gli alberi bilanciati sono spesso utili al progetto di algoritmi ottimali
attraversamento di un albero: visita (l'informazione associata a) tutti i vertici dell'albero
per gli alberi binari, si hanno tre discipline di visita ricorsiva, cioè basate sulla struttura ricorsiva dell'albero:
definizione ricorsiva di funzione di attraversamento in preordine
(btree* = btlink
):
void attraversa(btlink h, void visita(btlink)) { if (h == 0) return; visita(h); attraversa(h->l, visita); attraversa(h->r, visita); }
per ottenere da questa le analoghe definizioni per le altre due discipline
ricorsive di attraversamento basta spostare opportunamente l'invocazione di
visita(h)
le tre discipline di visita ricorsiva di alberi binari danno soluzioni a svariati problemi
le suddette discipline di visita possono essere realizzate anche con algoritmi non ricorsivi, impiegando una pila
push
dei sottoalberi nella pila è l'inverso di quello della loro visita
void attraversa(btlink h, void visita(btlink)) { Stack<btlink> s(max); s.push(h); while (!s.empty()) { visita(h = s.pop()); if (h->r != 0) s.push(h->r); if (h->l != 0) s.push(h->l); } }
nessuna delle tre suddette discipline di visita è adeguata al caso in cui si voglia attraversare un albero binario facendo procedere assieme gli attraversamenti dei suoi sottoalberi
è notevole il fatto che un algoritmo a tal scopo si può ottenere da quello non ricorsivo di attraversamento preordine, semplicemente adoperando una coda in luogo della pila, con le corrispondenti operazioni di inserimento e rimozione, dove l'ordine degli inserimenti coincide stavolta con quello della successiva visita, per via della disciplina FIFO
void attraversa(btlink h, void visita(btlink)) { Queue<btlink> q(max); q.put(h); while (!q.empty()) { visita(h = q.get()); if (h->l != 0) s.put(h->l); if (h->r != 0) s.put(h->r); } }
⌊
lg N⌋
+1