Esercitazione su Albero Binario Costruzione iteratore nel preordine Costruzione albero simmetrico Attraversamento per livelli dell’albero Costruttore di copia dell’albero 1 Esercitazione su Albero Binario Scaricare il file lab_java3.zip, scompattarlo ed analizzare le classi in esso contenute con particolare attenzione alla classe BinarySearchTree Per poter utilizzare la classe BinarySearchTree (vedi costruttore) è necessario fornire un oggetto di tipo Comparator. A tale scopo scrivere in Java l'implementazione della classe MyComparator che implementi l'interfaccia Comparator di Java : public class MyComparator<K extends Integer> implements java.util.Comparator<K> {/* . . . . */ } • public int compare(K a, K b) {/* . . . . */ } 2 1 Esercitazione su Albero Binario Scrivere un classe con un metodo main per creare un oggetto di tipo BinarySearchTree<Integer,String> e provare ad inserire alcune coppie formate da chiave di tipo Integer e valore di tipo String Dotare la classe BinarySearchTree del metodo public Iterator preorderPositions() {/* ... */} che ritorna un Iteratore sulle posizioni dell'albero binario di ricerca (Vedi codice in commento alla fine del file BinarySearchTree.java) Tale iteratore deve essere implementato con la classe PreorderPositionIterator di seguito schematizzata 3 classe PreorderPositionsIterator class PreorderPositionIterator<E> implements Iterator<Position<E>> { private BinaryTree<E> T; //binary tree private Position<E> cur; //current position PreorderPositionIterator ( BinaryTree<E> T ) { } // INSERIRE IL CODICE public boolean hasNext() { // INSERIRE IL CODICE } public Position<E> next() { // INSERIRE IL CODICE } public void remove() { } } //class 4 2 Albero Binario – preOrder Algorithm preOrder(v) visit(v) if hasLeft (v) preOrder (left (v)) if hasRight (v) preOrder (right (v)) 1 2 7 3 4 5 8 9 6 5 Successore nel preordine di un dato nodo Il primo nodo visitato è la radice se esiste il sottoalbero sinistro, il successore è la radice del sottoalbero sinistro altrimenti, se esiste il sottoalbero destro, il successore è la radice del sottoalbero destro altrimenti risale finché è figlio destro; poi, se non è radice, 1 passa al fratello destro 2 7 3 4 5 8 9 6 6 3 Successore nel preordine di un dato nodo attuale succ.re sin des già visitato succ.re attuale des 7 Successore nel preordine di un dato nodo già visitato già visitato succ.re già visitato attuale 8 4 Successore nel preordine di un dato nodo già visitato succ.re già visitato Esiste sempre poiché l’albero è proprio, può essere un nodo esterno già visitato attuale 9 Albero Binario -preordine n = ordine di visita 1 2 16 3 7 4 5 6 17 8 9 10 18 12 11 13 22 19 15 20 21 23 24 10 5 Ulteriori esercizi - Albero speculare 51 43 75 33 60 87 55 65 51 75 43 87 60 65 33 55 11 Ulteriori esercizi – Visita per livelli Usare una coda : Q.inserisci(radice) while ( Q non vuota ) nod = Q.estrai() inserisci in Q i figli di nod, se ci sono, . . . . ......... 51 43 75 33 60 55 87 65 12 6 Ulteriori esercizi – Costruttore di Copia Nuovo costruttore per la classe BinarySearchTree public BinarySearchTree ( BinarySearchTree<E> T ) { N.B. : duplica tutti i nodi } 51 43 75 33 60 55 87 65 13 7