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