Alberi binari ( 7.3) + a 3 b Albero Binario ( 7.3) DEFINIZIONE Albero Binario è un albero ordinato in cui ogni nodo ha al più due figli. Un albero binario si dice proprio se ogni nodo ha o zero o figli DEFINIZIONE RICORSIVA Albero Binario (proprio) : o è l'insieme vuoto o è un elemento (nodo radice) con un sottoalbero sinistro e un sottoalbero destro r Sin Des
Albero Binario rappresentazione nodo radice 44 7 nodi interni 78 3 50 88 nodi esterni 48 6 3 Arithmetic Expression Tree Albero binario che rappresenta una espressione aritmetica nodi interni operatori nodi esterni operandi Esempio: albero binario per l espressione : ( (a - ) + (3 b)) + a 3 b 4
Decision Tree Albero binario associato ad un processo decisionale nodi interni: domande con risposta si/no nodi esterni: decisioni Esempio: decidere come fare il pranzo Want a fast meal? Yes How about coffee? No On expense account? Yes No Yes No Starbucks Spike s Al Forno Café Paragon 5 BinaryTree ADT ( 7.3.) L ADT BinaryTree ADT estende l ADT Tree, i.e., eredita tutti i metodi dell ADT Tree, più ne aggiunge di nuovi: Metodi addizionali : position left (p) position right (p) boolean hasleft (p) boolean hasright (p) Ulteriori metodi di modifica (update) possono essere definiti dalle strutture dati che implementano il BinaryTree ADT 6 3
BinaryTree Interface ( 7.3.) public interface BinaryTree<E> extends Tree<E> { public Position<E> left (Position<E> v) throws InvalidPositionException, BoundaryViolationException; public Position<E> right (Position<E> v) throws InvalidPositionException, BoundaryViolationException; public boolean hasleft (Position<E> v) throws InvalidPositionException; public boolean hasright (Position<E> v) throws InvalidPositionException; 7 Albero Binario proprietà ( 7.3.3) Teorema: Un albero binario completo con n nodi ha altezza h = log n, infatti : limite inferiore: poichè vi sono i nodi alla profondità i = 0,, h - e almeno un nodo alla profondità h, risulta : n + + 4 + + h- + = ( - h ) / (-) = h così, n h, i.e., h log n depth 0 h h keys h 8 4
Albero Binario proprietà ( 7.3.3) Limite superiore: poichè vi sono al più h nodi alla profondità h, risulta: n + + 4 + + h- + h = h+ - così, n+ h+, i.e., log (n+)- h log (n+)- h log n h = log n depth 0 h h keys h 9 Albero Binario proprietà ( 7.3.3) Notazione n numero nodi n E numero nodi esterni n I numero nodi interni h altezza Proprietà n E = n I + n = n E h n I h (n )/ n E h h log n E h log (n + ) 0 5
Albero Binario proprietà ( 7.3.3) Teorema: in albero binario proprio risulta : n E = n I + removeaboveexternal A A B D D c c A A A c D D Albero Binario Algoritmi di attraversamento ( 7.3.6) 6 8 4 7 9 3 5 6
Albero Binario inorder ( 7.3.6) Algorithm inorder( T, v ) if hasleft (T, v) inorder (left (T, v)) visit(t, v) if hasright (T, v) inorder (right (T, v)) 6 8 4 7 9 3 5 3 Albero Binario postorder ( 7.3.6) Esempio di postorder: valutazione di una espressione il metodo ricorsivo ritorna il valore di un sotto_albero quando visita un nodo interno applica l operatore ai valori ottenuti visitando i sottoalberi sinistro e destro Algorithm evalexpr(t,v) + if isexternal (T,v) return v.element () else 5 3 x evalexpr(leftchild (T,v)) y evalexpr(rightchild (T,v)) operator stored at v return x y 4 7
Albero Binario Attraversamento Successore nell inordine di un dato nodo: il primo nodo dell albero visitato è il nodo g successore di b è h (il nodo più a sinistra nel sottoalbero destro) il successore di i è a (il padre del primo figlio sinistro risalendo) a b c d e f g h i l m 5 Albero Binario Inorder Iterator () Il primo nell inordine : il più a sinistra nel sottoalbero sinistro della radice x () () (3) Schema dell attraversamento : S D se sotto-albero destro non è vuoto, il successivo è il primo nel sotto-albero destro altrimenti, il successivo è il padre del primo figlio sinistro che si incontra risalendo di figlio in padre 6 8
Interfaccia Iterator<E> public interface Iterator<E> { boolean hasnext() // Returns true if the iteration has more elements Enext() // Returns the next element in the interation void remove() // Removes from the underlying collection the last element // returned by the iterator (optional operation) 7 Albero Binario Inorder Iterator () public class InorderPositionsIterator<E> implements Iterator<E> { posizione corrente private Position<E> cur; private BinaryTree<E> T; private Position<E> inorderfirst( Position<E> p ) { while ( T.hasLeft(p) ) p = T.left(p); return p; il costruttore il primo nell inordine nel sottoalbero p InorderPositionsIterator( BinaryTree<E> T ) { this.t = T; cur = inorderfirst(t.root()); l albero su cui iterare attuale posizione corrente 8 9
Albero Binario Inorder Iterator (3) public boolean hasnext() { return cur!= null; prima ritorna la posizione public E next() { corrente e poi la aggiorna if ( cur == null ) throw new NoSuchElementException(); Position<E> pos = cur; if ( T.isInternal(cur) ) cur = inorderfirst(t.right(cur)); else { while (! T.isRoot(cur) && cur == T.right(T.parent(cur)) ) cur = T.parent(cur); if ( cur == T.root() ) cur = null; else cur = T.parent(cur); return pos; risale sino al primo figlio sinistro risale di figlio in padre il successore è il padre del primo figlio sinistro 9 Albero Binario Inorder Iterator (4) public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException("remove"); //fine InorderIterator 0 0
Utilizzo di Inorder Iterator LinkedBinaryTree<Integer> T = new LinkedBinaryTree<Integer>(); //.............. Un albero binario T //.............. //.............. Un iteratore sull albero binario T Iterator<Position<Integer>> itp; itp = new InorderPositionsIterator<Integer>(T); while ( itp.hasnext() ) { Position<Integer> x = itp.next(); if ( T.isInternal(x) ) System.out.println("--> " + x.element() ); Albero Binario Tour di Eulero ( 7.3.6) 44 Eulero tour sin 7 des 78 sot 3 50 88 sin preordine sot inordine des postordine 48 6
Tour di Eulero pseudocodice Algorithm eulertour( T, v) //Albero binario action for visiting node v on left if T.hasLeft( T, v ) then eulertour( T, T.left(T, v ) ) action for visiting node v from below if T.hasRight(v) then eulertour( T, T.right(T, v ) ) action for visiting node v on right 3 Albero Binario EuleroTour ( 7.3.6) Algorithm printexpression(t, v) //Albero binario proprio if T.isExternal (v) print( v.element () ) else print( ( ) //PRE printexpression( T, T.left(v) ) print( v.element () ) //OPERATOR printexpression( T, T.right(v) ) print ( ) ) //POST + (( (a )) + (3 b)) 3 b a 4
Template Method Pattern ( 7.3.7) Algoritmo generico che può essere specializzato con la ridefinizione (overloading) di alcuni metodi Realizzato mediante una classe astratta Java I metodi di visita possono essere ridefiniti da sottoclassi Il Template method eulertour<e,r> viene ricorsivamente invocato sul figlio sinistro e sul figlio destro un oggetto TourResult con i campi left, right e out tiene traccia dell output delle chiamate ricorsive al metodo EulerTour 5 Template Method Pattern ( 7.3.7) public abstract class EulerTour <E,R> { protected BinaryTree<E> tree; Classe astratta metodo astratto public abstract R execute( BinaryTree<E> T ); protected void init( BinaryTree<E> T ) { tree = T; //........ metodo concreto 6 3
Template Method Pattern ( 7.3.7) protected R eulertour ( Position<E> v ) { TourResult<R> r = new TourResult<R>(); visitleft(v, r ); if ( tree.hasleft(v) ) r.left = eulertour(tree.left(v) ); visitbelow(v,r); if ( tree.hasright(v) ) r.right = eulertour(tree.right(v) ); visitright(v,r); return r.out; Metodo concreto, il motore dell algoritmo, realizzato ricorsivamente 7 Template Method Pattern ( 7.3.7) protected void visitleft ( Position<E> v, TourResult<R> r ) { ; protected void visitright ( Position<E> v, TourResult<R> r ) { ; protected void visitbelow ( Position<E> v, TourResult<R> r ) { ; //class EulerTourTamassia Metodi che debbono essere ridefiniti dalla classe che specializza la classe astratta 8 4
Template Method Pattern public class PrintExpressionTour<E,R> extends EulerTour<E,R> { public R execute( BinaryTree<E> T ) { Specializzazione della classe init(t); astratta per la costruzione di System.out.println("Expression: "); eulertour(t.root()); un espressione parentizzata System.out.println(); return null; dell albero protected void visitleft ( Position<E> v ) { if (tree.isinternal(v) ) System.out.print( " ( ); protected void visitright ( Position<E> v ) { if (tree.isinternal(v) ) System.out.print( ") ); protected void visitbelow ( Position<E> v ) { if ( v.element()!= null ) System.out.print(v.element()); //class 9 Template Method Pattern public static void main( String argv[] ) throws Exception { BinaryTree T; //........ PrintExpressionTour pe = new PrintExpressionTour(); pe.execute(t); //main 30 5
Albero Binario Strutture dati per l implementazione di albero binario e ennario 3 Linked Structure for Binary Trees ( 7.3.4) Un nodo è rappresentato da un oggetto contenente : il rif. all Elemento il rif. al nodo Padre il rif. al nodo figlio Sin il rif. al nodo figlio Des B B A D A D C E C E L oggetto Nodo implementa l ADT Position 3 6
Array Rappresentation of Binary Trees ( 7.3.5) Parent(i) i/ a Left(i) *i Right(i) *i+ b 3 c 4 d 5 e 6 f 7 g 0 3 4 5 6 7 a b c d e f g 33 Rappresentazione albero ennario Un nodo è rappresentato da un oggetto contenente : il rif. all Elemento il rif. al nodo Padre B il rif. alla Sequenza dei nodi figli A D F B A D F C E C E 34 7
Rappresentazione albero binario 35 Rappresentazione di un albero (foresta) con un albero binario A A TRASFORMAZIONE B B C D E C E F G F D Il primo figlio diviene il figlio sinistro Il primo fratello destro diviene figlio destro G 36 8