You are on page 1of 20

ARBOLES DE BUSQUEDA BINARIA

DEFINIR EL ARBOL

Se definir el rbol con una clave de tipo entero (puede ser cualquier otra tipo de datos) y dos hijos: izquierdo (izq) y derecho (der). El rbol vaco se representar haciendo izq y der igual a nulo.

Representacin de un rbol binario en la memoria.

Cada nodo tiene la siguiente forma:

Recorridos de un rbol de Bsqueda Binaria (ABB)

Recorrido en preorden (prefijo)


Visita la raz. Recorre el subrbol izquierdo. Recorre el subrbol derecho.

Recorrido en inorden (infijo)


Recorre el subrbol izquierdo. Visita la raz Recorre el subrbol derecho.

Recorrido en postorden (postfijo)


Recorre el subrbol izquierdo. Recorre el subrbol derecho. Visita la raz.

Clase Nodo
class Nodo { Nodo hijoDer; Nodo hijoIz; Object info;

public Nodo(Object info) { this.info= info; this.hijoDer = null; this.hijoIz = null; }


}

Operaciones en Arboles de Busqueda Binaria

El repertorio de operaciones que se pueden realizar sobre un ABB es parecido al que realizbamos sobre otras estructuras de datos, ms alguna otra propia de rboles: Buscar un elemento. Insertar un elemento. Borrar un elemento. Movimientos a travs del rbol: Izquierda. Derecha. Raiz. Informacin: Comprobar si un rbol est vaco. Calcular el nmero de nodos. Comprobar si el nodo es hoja. Calcular la altura de un nodo. Calcular la altura de un rbol.

Buscar un elemento

Partiendo siempre del nodo raz, el modo de buscar un elemento se define de forma recursiva. Si el rbol est vaco, terminamos la bsqueda: el elemento no est en el rbol. Si el valor del nodo raz es igual que el del elemento que buscamos, terminamos la bsqueda con xito. Si el valor del nodo raz es mayor que el elemento que buscamos, continuaremos la bsqueda en el rbol izquierdo. Si el valor del nodo raz es menor que el elemento que buscamos, continuaremos la bsqueda en el rbol derecho. El valor de retorno de una funcin de bsqueda en un ABB puede ser un puntero al nodo encontrado, o NULL, si no se ha encontrado.

Algoritmo De Busqueda
Si dato < NODO.info Si NODO.IZQ == null Escribir El nodo no se encuentra en el rbol Si no Bsqueda (NODO.izq,dato) Si no Si Dato > NODO.INFO entonces Si NODO.DER = null Escribir No se encuentra Si no Bsqueda (NODO.der,dato) Si no Escribir El NODO se encuentra en el rbol si nodo != null si Dato < NODO .INFO Bsqueda (Nodo.izq,Dato) si no si Dato > No dato.der Bsqueda (No dato.der,dato) si no escribir El Dato se encuentra Si no Escribir El dato no se encuentra en el rbol

void buscar(Nodo nodo, int info) { if (nodo != null) { if (info < nodo.info.numPedido) { buscar(nodo.hijoIz, info); } else { if (info > nodo.info.numPedido) { buscar(nodo.hijoDer, info); } else { JOptionPane.showMessageDialog(null,nodo.info.num Pedido+" "+nodo.info.nombre+" "+nodo.info.fechaEtrega+" "+nodo.info.tel+" "+nodo.info.sabor+" "+nodo.info.tipo+" "+nodo.info.precio+"\n"); } } }else { JOptionPane.showMessageDialog(null, "No se encontro"); } }

Insertar un Elemento

Para insertar un elemento nos basamos en el algoritmo de bsqueda. Si el elemento est en el rbol no lo insertaremos. Si no lo est, lo insertaremos a continuacin del ltimo nodo visitado. Necesitamos un puntero auxiliar para conservar una referencia al padre del nodo raz actual. El valor inicial para ese puntero es NULL. Padre = NULL nodo = Raiz Bucle: mientras actual no sea un rbol vaco o hasta que se encuentre el elemento. Si el valor del nodo raz es mayor que el elemento que buscamos, continuaremos la bsqueda en el rbol izquierdo: Padre=nodo, nodo=nodo->izquierdo. Si el valor del nodo raz es menor que el elemento que buscamos, continuaremos la bsqueda en el rbol derecho: Padre=nodo, nodo=nodo->derecho. Si nodo no es NULL, el elemento est en el rbol, por lo tanto salimos. Si Padre es NULL, el rbol estaba vaco, por lo tanto, el nuevo rbol slo contendr el nuevo elemento, que ser la raz del rbol. Si el elemento es menor que el Padre, entonces insertamos el nuevo elemento como un nuevo rbol izquierdo de Padre. Si el elemento es mayor que el Padre, entonces insertamos el nuevo elemento como un nuevo rbol derecho de Padre. Este modo de actuar asegura que el rbol sigue siendo ABB.

Algoritmo De Inserccion
Si NODO Null{
Si (INFOR < NODO.INFO)

Regresar a INSERCION1 con NODO.IZQ e INFOR sino si ( INFOR > NODO.INFO) Regresar a INSERCION1 con NODO.DER e INFOR sino Escribir El nodo ya se encuentra en el rbol
} // } si

else CREA (OTRO) {Crear un nuevo nodo} Hacer OTRO.IZQ = null, OTRO.DER = null, OTRO.INFO = INFOR y NODO = OTRO }

Supngase que quieren insertarse las siguientes los siguientes datos en un rbol binario de bsqueda que se encuentra vaci.

120 87 43 65 140 99 130 22 56


120

87

140

43

65 I 99

130

22

56

void altas(Pastel info) { Nodo nodo = Raiz; altas(nodo, info); } void altas(Nodo nodo, Pastel datos) { if (VaciaLista()) { Nodo nvo_nodo = new Nodo(datos); Raiz = nvo_nodo; } else { if (nodo.info.numPedido > datos.numPedido) { if (nodo.hijoIz == null) { Nodo nvo_nodo = new Nodo(datos); nodo.hijoIz = nvo_nodo; } else { altas(nodo.hijoIz, datos); } } else { if (nodo.info.numPedido < datos.numPedido) { if (nodo.hijoDer == null) { Nodo nvo_nodo = new Nodo(datos); nodo.hijoDer = nvo_nodo; } else { altas(nodo.hijoDer, datos); } } else { JOptionPane.showMessageDialog(null, "Este dato ya existe " + datos.getPrecio() + " " + datos.nombre + " " + datos.getSabor()); } } }

Eliminar Elemento

En el rbol de ejemplo, borrar el nodo 3. Localizamos el nodo a borrar, al tiempo que mantenemos un puntero a 'Padre'. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. Borramos el 'nodo'.

Borrar un nodo hoja

public String consulta() { Nodo nodo = Raiz; String cadena =consultainorden(nodo); return cadena; } String consultainorden(Nodo nodo){ String cadena=new String(); if(nodo!=null){ cadena=cadena+consultainorden(nodo.hijoIz); cadena=cadena+nodo.info.numPedido+"\t"+nodo.info .nombre+"\t"+nodo.info.fechaEtrega+"\t"+nodo.info.te l+"\t"+nodo.info.sabor+"\t"+nodo.info.tipo+"\t"+nodo.i nfo.precio+"\n"; cadena=cadena+consultainorden(nodo.hijoDer); } else{cadena="";} return(cadena); }

Algoritmo Eliminar
si NODO !=null entonces si Dato < NODO.info Eliminacin (NODO.izq, Dato) si no si dato > NODO.INFO entonces Eliminacin (NODO.der, Dato si no otro = NODO si otro.der == null entonces NODO = otro.izq si no si otro.izq == null entonces NODO = otro.der

Si no
{aux = otro.izq aux1 = Aux while (aux.der != null ) aux1 = aux aux = aux.der } otro.info = aux.info otro = aux
aux1.der = aux.izq quita (otro) (null)

si no Escribir (el nodo no se encuentra en el rbol) }

You might also like