Esercitazione su Albero Binario Costruzione iteratore nel preordine Costruzione albero simmetrico Attraversamento per livelli dell albero Costruttore di copia dell albero Esercitazione su Albero Binario Scaricare il file lab_java.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) {/*.... */ }
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 classe PreorderPositionsIterator class PreorderPositionIterator<E> implements java.util.iterator { 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
Albero Binario preorder Algorithm preorder(v) visit(v) if hasleft (v) preorder (left (v)) if hasright (v) preorder (right (v)) 7 8 9 5 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, passa al fratello destro 7 8 9 5 6 6
Successore nel preordine di un dato nodo attuale succ.re sin des già visitato attuale succ.re des 7 Successore nel preordine di un dato nodo già visitato già visitato succ.re già visitato attuale 8
Albero Binario -preordine 6 8 7 8 7 9 9 5 6 0 5 0 9 Ulteriori esercizi - Albero speculare 5 75 60 87 55 65 5 75 87 60 65 55 0 5
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,.... 5 75 60 87 55 65 Ulteriori esercizi Costruttore di Copia Nuovo costruttore per la classe BinarySearchTree public BinarySearchTree ( BinarySearchTree<E> T ) { } N.B. : duplica tutti i nodi 5 75 60 87 55 65 6
Ulteriori esercizi Rotazioni Rotazione destra Y X X Y γ α α β α x β y γ β γ Ulteriori esercizi Rotazioni Rotazione destra Y X X Y γ α α β α x β y γ β γ 7
Ulteriori esercizi Rotazione di nodi void rightrotate( Position x ) { // RIGHT-ROTATE Position y = parent(x); setleftchild( y, rightchild(x) ); setparent( rightchild(x), y ); if ( isroot(y) ) { setroot(x); setnullparent(x); } else if ( onleft(y) ) { setleftchild( parent(y), x ); setparent( x, parent(y) ); } else { setrightchild(parent(y), x ); setparent( x, parent(y) ); } setrightchild(x,y); setparent(y,x); return; } 5 8