Laboratorio Java 1 Albero Binario GT 7.3 1 Esercitazione Sono dati : interfacce di Positio<E>, Tree<E>, e BinaryTree<E>; il file TestLinkedBinaryTree.java e i file .class che implementano le interfacce www.dei.unipd.it/corsi/fi2ae Sezione riservata del sito : account: studentefi2ae passwd: deifi2ae 2 1 Position – Interface public interface Position<E> { /** Returns the element stored at this position. */ public E element ( ) ; } 3 Tree – Interface semplificata (1) public interface Tree<E> { public int size(); /** Returns the number of nodes in the tree. */ public boolean isEmpty(); /** Returns whether the tree is empty. */ /** Replaces the element stored at a given node. */ public E replace (Position<E> v, E e) throws InvalidPositionException; /** Returns the root of the tree. */ public Position<E> root() throws EmptyTreeException; /** Returns the parent of a given node. */ public Position<E> parent(Position<E> v) throws InvalidPositionException, BoundaryViolationException; 4 2 Tree – Interface semplificata (2) /** Returns an Iterable of the children of a given node. */ public Iterable<Position<E>> children(Position<E> v) throws InvalidPositionException; /** Returns whether a given node is internal. */ public boolean isInternal(Position<E> v) throws InvalidPositionException; /** Returns whether a given node is external. */ public boolean isExternal(Position<E> v) throws InvalidPositionException; /** Returns whether a given node is the root of the tree. */ public boolean isRoot(Position<E> v) throws InvalidPositionException; } //fine tree interface 5 BinaryTree Interface 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; /** Expand an external node into an internal node with two external node children */ public void expandExternal(Position<E> v, E left, E right); } 6 3 TestLinkedBinaryTree.java import java.util.*; public class TestLinkedBinaryTree { public static void main( String argv[] ) throws Exception { BinaryTree<Integer> T = new LinkedBinaryTree<Integer>(); Position<Integer> p1,p2,p3,p4,p5,p6,p7,p8,p9; p1 = T.root(); T.expandExternal(p1,null,null); T.replace(p1,new Integer(1)); p2 = T.left(p1); T.expandExternal(p2,null,null); T.replace(p2,new Integer(2)); // . . . . . . . . . . . //INSERIRE QUI IL CODICE RICHIESTO p1 1 1 p1 p2 p1 2 } //main } //class 7 Albero utilizzato nell’esempio 8 4 Come esercitazione: Trovare la Position<E> r della radice dell'albero e stampare il valore associato a tale posizione Inserire un ciclo che a partire dalla posizione della radice dell'albero determini la posizione x del nodo interno più a sinistra e ne stampi il contenuto Determinare la posizione z dello zio di x e stamparne il contenuto Scrivere un metodo statico con signature : public static <E> Position<E> leftMost( BinaryTree<E> T, Position<E> p ) che determina la posizione del nodo interno più a sinistra del sottoalbero di T con radice p. Verificare il corretto funzionamento del metodo applicandolo ai nodi r, z, x 9 continua Scrive un metodo public static <E> int depth(BinaryTree<E> T, Position<E> p) { /*. . .*/ } che determina la profondità del sottoalbero p di T Scrive un metodo public static <E> int height(BinaryTree<E> T, Position<E> p) { /*. . .*/} che determina la altezza del sottoalbero p di T Scrivere un metodo statico public static <E> Position search( BinaryTree<E> T, Position <E> p, Integer n ) { /*. . .*/ } che ritorna la posizione del nodo (nel sottoalbero p di T) che contiene il valore n, se esiste, altrimenti ritorna null. 10 5 Esempio uso metodi statici import java.util.*; public class TestLinkedBinaryTree { public static <E> Position<E> leftMost( BinaryTree<E> T, Position<E> p) { // CODICE leftMost } public static void main( String argv[] ) throws Exception { BinaryTree<Integer> T = new LinkedBinaryTree<Integer>(); // . . . . . . . . . . . Position<Integer> px = leftMost( T, x ); // es. uso metodo statico } //main } //class 11 6