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 vacío se representará haciendo izq y der igual a nulo.

Representación de un árbol binario en la memoria.  Cada nodo tiene la siguiente forma: .

 Recorre el subárbol derecho.Recorridos de un árbol de Búsqueda Binaria (ABB)  Recorrido en preorden (prefijo) Visita la raíz.  Recorre el subárbol izquierdo.  .

 .  Visita la raíz  Recorre el subárbol derecho. Recorrido en inorden (infijo) Recorre el subárbol izquierdo.

 . Recorrido en postorden (postfijo) Recorre el subárbol izquierdo.  Visita la raíz.  Recorre el subárbol derecho.

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

Insertar un elemento. Información:  Comprobar si un árbol está vacío.  Derecha.  Calcular la altura de un nodo.  Raiz.  Comprobar si el nodo es hoja.  Calcular la altura de un árbol.  Calcular el número de nodos.Operaciones en Arboles de Busqueda Binaria       El repertorio de operaciones que se pueden realizar sobre un ABB es parecido al que realizábamos sobre otras estructuras de datos. más alguna otra propia de árboles: Buscar un elemento. Movimientos a través del árbol:  Izquierda. . Borrar un elemento.

. o NULL. si no se ha encontrado. Si el valor del nodo raíz es mayor que el elemento que buscamos. El valor de retorno de una función de búsqueda en un ABB puede ser un puntero al nodo encontrado.Buscar un elemento       Partiendo siempre del nodo raíz. terminamos la búsqueda: el elemento no está en el árbol. Si el árbol está vacío. continuaremos la búsqueda en el árbol izquierdo. Si el valor del nodo raíz es igual que el del elemento que buscamos. continuaremos la búsqueda en el árbol derecho. terminamos la búsqueda con éxito. Si el valor del nodo raíz es menor que el elemento que buscamos. el modo de buscar un elemento se define de forma recursiva.

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

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

El valor inicial para ese puntero es NULL. entonces insertamos el nuevo elemento como un nuevo árbol izquierdo de Padre. el árbol estaba vacío. Si nodo no es NULL. entonces insertamos el nuevo elemento como un nuevo árbol derecho de Padre. lo insertaremos a continuación del último nodo visitado. nodo=nodo->izquierdo.  Si el valor del nodo raíz es mayor que el elemento que buscamos. . Este modo de actuar asegura que el árbol sigue siendo ABB. Si no lo está. Si Padre es NULL. Necesitamos un puntero auxiliar para conservar una referencia al padre del nodo raíz actual.  Si el valor del nodo raíz es menor que el elemento que buscamos.Insertar un Elemento           Para insertar un elemento nos basamos en el algoritmo de búsqueda. el nuevo árbol sólo contendrá el nuevo elemento. por lo tanto salimos. Si el elemento está en el árbol no lo insertaremos. Si el elemento es mayor que el Padre. por lo tanto. Si el elemento es menor que el Padre. continuaremos la búsqueda en el árbol derecho: Padre=nodo. Padre = NULL nodo = Raiz Bucle: mientras actual no sea un árbol vacío o hasta que se encuentre el elemento. el elemento está en el árbol. continuaremos la búsqueda en el árbol izquierdo: Padre=nodo. que será la raíz del árbol. nodo=nodo->derecho.

INFO) Regresar a INSERCION1 con NODO.DER = null. OTRO.IZQ = null.IZQ e INFOR sino si ( INFOR > NODO.INFO) Regresar a INSERCION1 con NODO.INFO = INFOR y NODO = OTRO } .Algoritmo De Inserccion Si NODO ≠ Null{ Si (INFOR < NODO. OTRO.DER e INFOR sino Escribir “El nodo ya se encuentra en el árbol” } // } si else CREA (OTRO) {Crear un nuevo nodo} Hacer OTRO.

120 –87 – 43 – 65 – 140 – 99 – 130 – 22 – 56 120 87 140 43 65 I 99 130 22 56 . Supóngase que quieren insertarse las siguientes los siguientes datos en un árbol binario de búsqueda que se encuentra vació.

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

Borramos el 'nodo'. al tiempo que mantenemos un puntero a 'Padre'. Borrar un nodo hoja . ahora apunte a NULL. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo'.Eliminar Elemento     En el árbol de ejemplo. borrar el nodo 3. Localizamos el nodo a borrar.

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

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

info otro = aux aux1.izq quita (otro) (null) si no Escribir („el nodo no se encuentra en el árbol‟) } .der } otro.Si no {aux = otro.der = aux.izq aux1 = Aux while (aux.info = aux.der != null ) aux1 = aux aux = aux.