Árboles Binarios de Búsqueda

Anuncio
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
Descargar