Per la ricerca di un elemento in un albero binario
di ricerca vediamo il primo esempio di algoritmo che sfrutta la proprietà
(ABR).
Questa proprietà permette di ridurre la ricorsione doppia, tipica
degli algoritmi su alberi binari, ad una ricorsione singola.
L'algoritmo assume che l'oggetto da cercare implementi
Comparable, per poterlo confrontare
con le chiavi dell'albero utilizzando il metodo compareTo().
// Ricerca di un oggetto in un albero binario di ricerca,
// algoritmo ricorsivo
public static <E extends Comparable<E>> boolean cercaABR(E x, BinNode<E> r){
// caso base (albero vuoto)
if (r == null) return false;
// caso ricorsivo (albero non vuoto)
if (x.compareTo(r.key) < 0) return cercaABR(x, r.left);
if (x.compareTo(r.key) > 0) return cercaABR(x, r.right);
return true;
}
|
A ogni passo si visita un solo sottoalbero: infatti le due chiamate ricorsive
compaiono nel metodo in rami mutuamente esclusivi. Di conseguenza nel caso
pessimo la ricerca ha una complessità proporzionale alla profondità
dell'albero, cioè logaritmica nel numero di nodi dell'albero (se bilanciato).
Ricordiamo invece che la ricerca in un albero binario, nel caso pessimo
(ad esempio, se la chiave cercata non esiste) dobbiamo visitare tutti i
nodi, quindi la complessità è lineare nel numero dei nodi. D'altra parte non vi è la restrizione sul tipo di E
// Ricerca di un oggetto in un albero binario,
public static <E> boolean cercaAB(E x, BinNode<E> r){
//caso base (albero vuoto)
if (r == null) return false;
//caso ricorsivo (albero non vuoto)
if (x.equals(r.key)) return true;
if (cercaAB(x,r.left)) return true;
return cercaAB(x,r.right);
|
|