EDA 2004/05 Árbol Binario de Búsqueda public class ArbolBinarioBusqueda implements Diccionario{ protected NodoBinario raiz; // otros atributos public ArbolBinarioBusqueda () {raiz=null;} public void insertar(Object x) throws ElementoDuplicado {raiz=insertar(x,raiz);} public Object buscar(Object x) throws DiccionarioVacio, ElementoNoEncontrado { i f esVacio() throw new DiccionarioVacio(“diccionario vací o”); return buscar(x,raiz).dato; } Paolo Rosso Grupo: ENG (ETSIA) EDA 2004/05 Árbol Binario de Búsqueda public void eliminar(Object x) throws DiccionarioVacio, ElementoNoEncontrado { i f esVacio() throw new DiccionarioVacio(“diccionario vací o”); raiz=eliminar(x,raiz);} } protecetd Object buscarMin() throws ExcepcionColaVacía { return buscarMin(raiz).dato; } protected Object eliminarMin() throws ExcepcionColaVací a { raiz=eliminarMin(raiz); } Paolo Rosso Grupo: ENG (ETSIA) EDA 2004/05 Árbol Binario de Búsqueda protected Object buscarMax() throws ExcepcionColaVací a { return buscarMax(raiz).dato; } public boolean esVacio() {...} public void vaciar() {...} Paolo Rosso Grupo: ENG (ETSIA) 1 EDA 2004/05 Árbol Binario de Búsqueda protected NodoBinario insertar (Object x, NodoBinario t) throws ElementoDuplicado { if (t==null) t=new NodoBinario(x,null,null); else if (((Comparable) x).compareTo(t.dato)<0) t.izq=insertar(x,t.izq); else if (((Comparable) x).compareTo(t.dato)>0) t.der=insertar(x,t.der); else throw new ElementoDuplicado(“insertar de ArbolBinarioBusqueda”); return t; } Paolo Rosso Grupo: ENG (ETSIA) EDA 2004/05 Árbol Binario de Búsqueda protected NodoBinario buscar (Object x, NodoBinario t) throws ElementoNoEncontrado { while (t!=null) if (((Comparable) x).compareTo(t.dato)<0) t=t.izq; else if (((Comparable) x).compareTo(t.dato)>0) t=t.der; else return t; throw new ElementoNoEncontrado(“buscar en ArbolBinarioBusqueda”); } Paolo Rosso Grupo: ENG (ETSIA) EDA 2004/05 Árbol Binario de Búsqueda protected NodoBinario eliminar (Object x, NodoBinario t) throws ElementoNoEncontrado { if (t==null) throw new ElementoNoEncontrado(“eliminar de ArbolBinarioBusqueda”); if (((Comparable) x).compareTo(t.dato)<0) t.izq=eliminar(x,t.izq); else if (((Comparable) x).compareTo(t.dato)>0) t.der=eliminar(x,t.der); else if (t.izq!=null && t.der!=null) { t.dato=buscarMin(t.der).dato; t.der=eliminarMin(t.der);} else t=(t.izq!=null) ? t.izq : t.der; return t; Paolo Rosso Grupo: ENG (ETSIA) } 2 EDA 2004/05 Árbol Binario de Búsqueda protected NodoBinario buscarMin (NodoBinario t) throws ExcepcionColaVacía { if (t==null) throw new ExcepcionColaVací a (“buscarMin en ArbolBinarioBusqueda”); while (t.izq!=null) t=t.izq; return t; } Paolo Rosso Grupo: ENG (ETSIA) EDA 2004/05 Árbol Binario de Búsqueda protected NodoBinario buscarMax (NodoBinario t) throws ExcepcionColaVacía { if (t==null) throw new ExcepcionColaVací a (“buscarMax en ArbolBinarioBusqueda”); while (t.der!=null) t=t.der; return t; } Paolo Rosso Grupo: ENG (ETSIA) EDA 2004/05 Árbol Binario de Búsqueda protected NodoBinario eliminarMin(NodoBinariot) throws ExcepcionColaVacía { if (t==null) throw new ExcepcionColaVací a (“eliminarMin de ArbolBusqueda”); if (t.izq!=null) t.izq=eliminarMin(t.izq); else t=t.der; return t; } Paolo Rosso Grupo: ENG (ETSIA) 3 EDA 2004/05 Árbol Binario de Búsqueda Problema: que una inserci ón ordenada de los elementos puede provocar que el ABB se desequilibre completamente adquiriendo la forma de una rama, o lo que es lo mismo una lista (otro tanto puede producir el borrado). Coste: como el coste de las operaciones insertar, buscar, y eliminar tiene un coste máximo del orden del número de niveles, este coste en un ABB equilibrado será del orden del logaritmo del número de elementos, y en uno desequilibrado, del orden del número de elementos. Solución: mantener un cierto equilibrio a la hora de insertar (y borrar). Paolo Rosso Grupo: ENG (ETSIA) 4