A Albero Binario Il TDA BinaryTree B C D E Albero in cui ogni nodo ha al più due figli. I figli di un nodo costituiscono una coppia ordinata H F G I – I figli di un nodo vengono chiamati figlio sinistro e figlio destro Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo Albero sintattico Applicazioni Albero binario associato ad un’espressione: – Nodi interni: operatori – Nodi esterni: operandi Applicazioni: – Valutazione di espressioni aritmetiche – Rappresentazione di processi di decisione – Ricerca di un elemento in un insieme Esempio: (2 × (a − 1) + (3 × b)) + × × − 2 a Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 3 Albero delle decisioni binario b 1 4 Albero binario di ricerca 35 – Nodi interni: domande con risposte SI/NO – Nodi esterni: decisioni 35 30 Resto in casa? 20 Si 3 Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo Albero binario associato ad un processo di decisione SI/NO: 71 50 36 83 20 71 50 83 No Mi riposo? 22 Aria aperta? Si No Si No Libro PS2 Passeggiata Cinema Prof. Carlo Blundo 2 Laboratorio di Algoritmi e Strutture Dati 97 ok 22 sbagliato 93 5 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 97 93 6 1 Interfaccia BinaryTree Il TDA BinaryTree Il TDA BinaryTree è una specializzazione di Tree che supporta tre metodi addizionali leftChild(v) – Restituisce il figlio sinistro di v oppure errore se v non ha un figlio sinistro rightChild(v) – Restituisce il figlio destro di v oppure errore se v non ha un figlio destro sibling(v) – Restituisce il fratello di v oppure errore se v non ha un fratello Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo 7 Gerarchia completa Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 8 Struttura dati per rappresentare BinaryTree InspectableContainer size – isEmpty – elements Possiamo rappresentare il TDA Position tramite un nodo che contiene InspectablePositionalContainer positions InspectableTree PositionalContainer root – parent – children isIntenal – isExternal – isRoot public interface InspectableBinaryTree extends InspectableTree { // Metodi di accesso /** restituisce il figlio sinistro di un nodo */ public Position leftChild(Position v); /** restituisce il figlio destro di un nodo */ public Position rightChild(Position v); /** restituisce il fratello di un nodo */ public Position sibling(Position v); } public interface BinaryTree extends InspectableBinaryTree, PositionalContainer { } replaceElement – swapElement InspectableBinaryTree Tree leftChild – rightChild – sibling – un riferimento ad un elemento – un riferimento al nodo genitore – un riferimento al figlio sinistro – un riferimento al figlio destro Graficamente …. BinaryTree Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo 9 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 10 Classe BTNode – 1 ∅ public class BTNode implements Position { B ∅ B A A D ∅ ∅ ∅ E C Prof. Carlo Blundo public BTNode() {} D ∅ C private Object element; private BTNode left, right, parent; ∅ Laboratorio di Algoritmi e Strutture Dati E 11 public BTNode(Object o, BTNode u, BTNode v, BTNode w) { setElement(o); setParent(u); setLeft(v); setRight(w); } Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 12 2 Classe BTNode – 2 Un’altra rappresentazione public Object element() { return element; } public void setElement(Object o) { element = o; } public BTNode getLeft() { return left; } public void setLeft(BTNode v) { left = v; } • p(v)=1 public BTNode getRight() { return right; } – se v è il figlio sinistro di u allora public void setRight(BTNode v) { right = v; } • p(v)=2p(u) – se v è il figlio destro di u allora public BTNode getParent() { return parent; } • p(v)=2p(u)+1 public void setParent(BTNode v) { parent = v; } } Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo 13 Esempio 1 B 2 A Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 14 Implementazione statica: è necessaria una stima del numero massimo di nodi dell’albero 3 D 4 D 5 C In A[0] potremmo memorizzare il numero di elementi nell’albero binario Problemi con gli array B A Si usa un array A Ogni nodo v è memorizzato in posizione p(v) – se v è la radice allora E – può portare a spreco di risorse – nel caso peggiore, un albero con n nodi richiede un vettore con 2n-1 elementi (se l’albero degenera in una catena) 6 C 7 E • Provarlo come esercizio Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 15 Esercizi Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 16 Esercizi Implementare l’interfaccia BinaryTree (scrivere il codice della classe LinkedBinaryTree) usando l’implementazione BTNode per Position Scrivere il codice della classe ArrayBinaryTree che implementa l’interfaccia BinaryTree utilizzando un array per memorizzare i nodi dell’albero Testare le classi LinkedBinaryTree e ArrayBinaryTree provando tutti i metodi Valutare le differenze della complessità computazionale dei metodi implementati nelle due classi – In questo caso come possiamo implementare Position? Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 17 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 18 3 Visita postorder Visita preorder Le visite in alberi attraversano tutti i nodi dell’albero in Algorithm preOrder(v) maniera sistematica visit(v) Preorder: un nodo è ispezionato prima dei suoi for each child w of v discendenti preOrder (w) Applicazioni: stampa dell’indice di un documento strutturato 1 Data Structures and Algorithms in Java Un nodo è ispezionato dopo i suoi discendenti Applicazione: calcola lo spazio usato dai file in directory e sotto-directory 9 LASD/ 3 2 5 2. OOP 4 1.2 Methods 1.8 Packages 9 Bibliography 7 6 3 2.1 Exception 8 2.7 Exercises 2.5 Casting Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo 2 listaE.doc 200K 1 6 Stack.ppt 64.5K 6 Queue.ppt 96.5K Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo 7 4 5 Intro.ppt 85.5K 20 Visita inorder in alberi binari 1 5 4 1 Ulteriori esempi 3 studenti.xsl 53K Slide/ primaProva.doc 27.5K 19 8 7 ESAMI/ 1. Java Programming 2 Algorithm postOrder(v) for each child w of v postOrder (w) visit(v) 3 6 7 2 preorder 4 5 Un nodo è ispezionato dopo il suo sottoalbero sinistro e prima del suo sotto-albero destro Applicazione: disegnare un albero binario – x(v) = # nodi sotto-albero sinistro di v • rango inorder (numero di elementi visitati prima di v durante la visita inorder) postorder – y(v) = profondità di v Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo 21 Algorithm inOrder(v) if isInternal (v) inOrder (leftChild (v)) visit(v) if isInternal (v) inOrder (rightChild (v)) 6 Specializzazione della visita postorder – chiamate ricorsive calcolano i valori dei sotto-alberi – visitando un nodo, combina i risultati ottenuti dai sotto-alberi + 8 4 1 3 Prof. Carlo Blundo 7 × 9 5 23 Prof. Carlo Blundo Algorithm evalExpr(v) if isExternal (v) return v.element () else x ← evalExpr(leftChild (v)) y ← evalExpr(rightChild (v)) ⊗ ← operator stored at v return x ⊗ y × − 2 5 Laboratorio di Algoritmi e Strutture Dati 22 Valutazione espressioni aritmetiche Algoritmo ed esempio 2 Laboratorio di Algoritmi e Strutture Dati Prof. Carlo Blundo 3 2 1 Laboratorio di Algoritmi e Strutture Dati 24 4 Esercizi Suggerimenti Aggiungere, alla classe LinkedTree, il metodo preorder(). Deve restituire in una LinkedList i nodi dell’albero memorizzari secondo la visita preorder. Aggiungere, alla classe ArrayBinaryTree, il metodo preorder(). Deve restituire in una LinkedList i nodi dell’albero memorizzari secondo la visita preorder. Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 25 Esercizi Il metodo preorder() restituisce quello che è ritornato dalla funzione treePreorder(root(),L) LinkedList treePreorder(TreeNode v, LinkedList L) è la funzione che realmente visita l’albero ed inserisce i nodi incontrati nella lista L Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 26 Gerarchia completa Aggiungere a LinkedBinaryTree il metodo toString() che restituisce il contenuto dell’albero rappresentato tramite una stringa – toString() può essere implementato tramite una visita Aggiungere a LinkedBinaryTree il metodo eval() che restituisce il risultato della valutazione dell’espressione aritmetica rappresentata dall’albero Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 27 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 28 5