Algoritmi e Strutture Dati Capitolo 5 - Alberi Alberto Montresor Università 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. © Alberto Montresor 1 Alberi 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) ✦ T es.: radice T con n sottoalberi T1 © Alberto Montresor T2 Tn 2 Alberi ordinati T Radice (root) Figlio (child) di T Nodi interni = Nodi - Foglie Padre (parent) dei nodi j e k Figlio di T Radice del proprio sottoalbero Sottoalbero a j k ... Foglie (leaf) © Alberto Montresor Nodi fratelli (figli di a) 3 Alberi: definizioni In un albero ✦ Profondità di un nodo: la lunghezza del percorso dalla radice al nodo (i.e., numero archi attraversati) p=0 ✦ p=1 Livello: l'insieme dei nodi alla stessa profondità p=2 Altezza dell'albero: massimo livello delle sue foglie p=3 ✦ ✦ Livello 3 Altezza albero: 3 © Alberto Montresor 4 Alberi? DAG Radice Foresta © Alberto Montresor 5 Alberi: una possibile specifica © Alberto Montresor 6 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 ✦ © Alberto Montresor 7 Visita alberi: in profondità in ordine anticipato (previsita) T a b c e d f g Sequenza: a b c d e f g © Alberto Montresor 8 Visita alberi: in profondità in ordine posticipato (postvisita) T a b c e d f g Sequenza: c d b f g e a © Alberto Montresor 9 Visita alberi: in profondità in ordine simmetrico (invisita) T a b c e d f g Sequenza (i=1): c b d a f e g © Alberto Montresor 10 Visita alberi: in ampiezza T a b c e d f g Sequenza: a b e c d f g © Alberto Montresor 11 Realizzazione con vettore dei figli / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // / / / / Padre Rischio di sprecare memoria se molti nodi hanno grado minore del grado massimo k. © Alberto Montresor Nodo Array di Figli 12 Realizzazione con puntatori padre/primo-figlio/fratello / / / / / / / / / / / / / / / / Padre Nodo Primo Figlio Fratello Soluzione: usare una lista di figli (fratelli). © Alberto Montresor 13 Realizzazione con puntatori padre/primo-figlio/fratello © Alberto Montresor 14 Realizzazione con puntatori padre/primo-figlio/fratello © Alberto Montresor 15 Realizzazione con vettore dei padri L'albero è rappresentato da un vettore i cui elementi contengono l'indice del padre ✦ Esempio: ✦ 0 a T 1 b a 1 e b 2 c 2 d c e d f g 3 f 3 g © Alberto Montresor 16 Realizzazione con vettore dei padri © Alberto Montresor 17 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 ✦ © Alberto Montresor 18 Alberi binari Figlio sinistro Radice del sottoalbero sinistro Figlio destro Radice del sottoalbero destro Radice j.parent() Padre del nodo j (e k) Sottoalbero sinistro Sottoalbero destro a j k a.left() © Alberto Montresor a.right() 19 Alberi binari: specifica © Alberto Montresor 20 Alberi binari: realizzazione / / / Padre Figlio Sinistro © Alberto Montresor Figlio Destro / / / / / / / Nodo 21 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. © Alberto Montresor 22 Alberi binari: visite in profondità © Alberto Montresor 23 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 qualunque algoritmo di ordinamento richiede Ω(n log n) confronti ✦ © Alberto Montresor 24 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 © Alberto Montresor 25