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