Beruflich Dokumente
Kultur Dokumente
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.
Clase Nodo
class Nodo { Nodo hijoDer; Nodo hijoIz; Object info;
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.
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'.
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)