Corso di Algoritmi e Strutture Dati
Terza Esercitazione in Laboratorio
12/05/2004
Questa esercitazione è dedicata agli alberi binari di ricerca. È disponibile presso il sito web
http://www.dis.uniroma1.it/~allulli/asd/0304/Eserc3/. Potete ivi trovare la classe BSTNode,
che rappresenta un nodo di un albero binario di ricerca la cui chiave è un oggetto di tipo
Comparable.
Per compiere dei test è possibile usare i metodi contenuti nella classe Eserc3. Il metodo
statico importaBSTTrattini(String fileName) legge un BST dal file fileName, e
ne restituisce la radice. Il metodo stampaBSTTrattini(BSTNode r) stampa il BST di
radice r, con la notazione che abbiamo già usato nella seconda esercitazione.
Fase 1 (35 min.)
Scrivere un metodo Java che, dati un nodo v e due BST T 1 e T2, verifichi se l'albero
ottenibile rendendo T1 sottoalbero sinistro di v e T2 sottoalbero destro di v è un BST.
Valutare la complessità computazionale dell’algoritmo. (Tratto dalla domanda 2 del
compito d’esame del 25/09/2003).
Collaudare il metodo: dall’”unione” dei BST contenuti nei file bst1.txt e bst2.txt
tramite il nodo DISCO si ottiene effettivamente un BST.
Invece, unendo i BST contenuti in bst1.txt e bst3.txt tramite un nodo qualunque
(per esempio DISCO) non si ottiene un BST.
Nella pagina seguente sono raffigurati i tre BST contenuti nei file di esempio.
Fase 2 (30 min.)
Scrivere un metodo Java che, dato un albero binario T, decida se T è un albero di ricerca.
Analizzare la complessità dell’algoritmo. (Tratto dal problema 2 del compito d’esame A del
17/09/2002).
Per rappresentare un generico albero binario, che non è detto sia un BST, dovremmo
scrivere una classe apposita. Però osserviamo che con la nostra classe BSTNode (molto
povera di metodi!) possiamo rappresentare un nodo di un generico albero binario. Quindi,
per semplicità e soltanto ai fini di quest’esercitazione, assumiamo che l’input del metodo
richiesto sia di tipo BSTNode ma contenga la radice di un albero binario.
Collaudare il metodo con gli alberi binari contenuti nei file bst1.txt, bst2.txt,
bst3.txt (che contengono effettivamente dei BST) e nel file non-bst.txt (che
contiene un albero non di ricerca).
Fase 3 (tempo rimanente - per casa)
Scrivere un metodo rangeQuery(BSTNode t, Comparable a, Comparable b)
che visiti, stampandoli, tutti e soli i nodi del BST con radice t la cui chiave cada
nell’intervallo compreso fra a e b.
Collaudare il metodo, stampando tutti i nodi di bst3.txt con chiave compresa fra FAME e
MIAO.
bst1.txt
CERA
BALZO
DANTE
ARTE
BALLO
bst2.txt
GOAL
FOLLA
PARTE
FUGA
LENTO
VELOCE
bst3.txt
GOAL
FOLLA
DADO
PARTE
FUGA
LENTO
VELOCE