Professional Documents
Culture Documents
2013
Facultad de Ingeniera y Ciencias Naturales Ingeniera en Sistemas Computacionales Asignatura: Programacin III
Tema: Arboles BB
OBJETIVOS. Al finalizar esta sesin usted podr: Conocer los conceptos de rboles binarios de bsqueda Conocer las formas de representar un rbol binario de bsqueda Conocer las operaciones sobre un rbol binario de bsqueda
En caso de tener subrbol izquierdo, la raz R debe ser mayor que el valor mximo almacenado en el subrbol izquierdo, y que el subrbol izquierdo sea un rbol binario de bsqueda. En caso de tener subrbol derecho, la raz R debe ser menor que el valor mnimo almacenado en el subrbol derecho, y que el subrbol derecho sea un rbol binario de bsqueda.
Gua
Pgina
2013
Para la insercin de elementos a un rbol binario de bsqueda tenemos los siguientes valores insertados en este orden: (10,4,2,8,1,3,7,9,16,18,14,13,15,19,17)
10
16
14
18
13
15
17
19
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:
o
Izquierda, Derecha, Raz. 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. Gua
Informacin:
o o o o o
Pgina
2013
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.
Gua
Pgina
2013
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 actual = Raiz Bucle: mientras actual no sea un rbol vaco o hasta que se encuentre el elemento.
o
Si el valor del nodo raz es mayor que el elemento que buscamos, continuaremos la bsqueda en el rbol izquierdo: Padre=actual, actual=actual->izquierdo. Si el valor del nodo raz es menor que el elemento que buscamos, continuaremos la bsqueda en el rbol derecho: Padre=actual, actual=actual->derecho.
Si actual 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.
Gua
Pgina
2013
1. Localizamos el nodo a borrar, al tiempo que mantenemos un puntero a 'Padre'. 2. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. 3. Borramos el 'nodo'.
Gua
Pgina
2013
1. Localizamos el nodo a borrar ('raz'). 2. Buscamos el nodo ms a la izquierda del rbol derecho de 'raz', en este caso el 12, ya que el rbol derecho no tiene nodos a su izquierda, si optamos por la rama izquierda, estaremos en un caso anlogo. Al mismo tiempo que mantenemos un puntero a 'Padre' a 'nodo'. 3. Intercambiamos los elementos 6 y 12. 4. Ahora tenemos que repetir el bucle para el nodo 6 de nuevo, ya que no podemos eliminarlo.
Gua
Pgina
2013
2. Buscamos el nodo ms a la izquierda del rbol derecho de 'raz', en este caso el 16, al mismo tiempo que mantenemos un puntero a 'Padre' a 'nodo'. 3. Intercambiamos los elementos 6 y 16. 4. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. 5. Borramos el 'nodo'.
Gua
Pgina
2013
Gua
Pgina
2013
Gua
Pgina
2013
int Altura(){ return profundidad(raiz); } int profundidad(Nodo *p){ if(not p){ return 0; } else{ int profundidadI = profundidad(p->izquierdo); int profundidadD = profundidad(p->derecho); if( profundidadI > profundidadD){ return profundidadI+1; } else{ return profundidadD+1; } } }
int Altura(int v){ int altura = 0; actual = raiz; while(!vacio(actual)) { if(v == actual->Valor) return altura; else { altura++; if(v > actual->Valor) actual = actual->derecho; else if(v < actual->Valor) actual = actual->izquierdo; Gua
Pgina
10
2013
Ejercicios.
1- Ensamblar el cdigo proporcionado tanto el de las imgenes y el del texto para hacerlo uno 2- Hacer el mtodo que llama a los tres mtodos de los distintos recorrido 3- Hacer el siguiente men utilizando el cdigo proporcionado
Gua
Pgina
11