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
Albero: definizione informale 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 T2 Tn © Alberto Montresor
Nodi interni = Nodi - Foglie Padre (parent) dei nodi j e k Sottoalbero Alberi ordinati Figlio di T Radice del proprio sottoalbero Radice (root) T Figlio (child) di T Nodi interni = Nodi - Foglie Padre (parent) dei nodi j e k Sottoalbero a j k ... Nodi fratelli (figli di a) Foglie (leaf) © Alberto Montresor
Livello: l'insieme dei nodi alla stessa profondità Alberi: 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 p=1 p=2 p=3 Livello 3 Altezza albero: 3 © Alberto Montresor
Alberi? DAG Radice Foresta © Alberto Montresor
Alberi: una possibile specifica © 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 © Alberto Montresor
Visita alberi: in profondità in ordine anticipato (previsita) g Sequenza: a b c d e f g © Alberto Montresor
Visita alberi: in profondità in ordine posticipato (postvisita) g Sequenza: c d b f g e a © Alberto Montresor
Visita alberi: in profondità in ordine simmetrico (invisita) g Sequenza (i=1): c b d a f e g © Alberto Montresor
Visita alberi: in ampiezza c d f g Sequenza: a b e c d f g © Alberto Montresor
Realizzazione con vettore dei figli / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / Padre Array di Figli Rischio di sprecare memoria se molti nodi hanno grado minore del grado massimo k. Nodo © Alberto Montresor
Realizzazione con puntatori padre/primo-figlio/fratello Nodo Soluzione: usare una lista di figli (fratelli). © Alberto Montresor
Realizzazione con puntatori padre/primo-figlio/fratello © Alberto Montresor
Realizzazione con puntatori padre/primo-figlio/fratello © Alberto Montresor
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 1 e a 2 c b e 2 d c d f g 3 f 3 g © Alberto Montresor
Realizzazione con vettore dei padri © 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 © Alberto Montresor
Alberi binari Figlio destro Radice del sottoalbero destro Figlio sinistro Radice del sottoalbero sinistro Radice j.parent() Padre del nodo j (e k) Sottoalbero sinistro Sottoalbero destro a j k a.left() a.right() © Alberto Montresor
Alberi binari: specifica © Alberto Montresor
Alberi binari: realizzazione / / / / / / / / / / Padre Figlio Sinistro Figlio Destro Nodo © 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. © Alberto Montresor
Alberi binari: visite in profondità © 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 qualunque algoritmo di ordinamento richiede Ω(n log n) confronti © 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 © Alberto Montresor