You are on page 1of 11

Universidad de Sonsonate Programacin III

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

MATERIAL Y EQUIPO Computadora con CodeBlock Instalado Gua 5 de Programacin III

Introduccin. Arboles binarios de bsqueda


La mayora de los rboles binarios son de bsqueda Un rbol binario no vaco, de raz R, es un rbol binario de bsqueda si:

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

Universidad de Sonsonate Programacin III Procedimiento.

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

Universidad de Sonsonate Programacin III


Clase Nodo

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

Universidad de Sonsonate Programacin III


Insertar un elemento

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.

Este modo de actuar asegura que el rbol sigue siendo ABB.

Gua

Pgina

Universidad de Sonsonate Programacin III


Ejemplo 1: Borrar un nodo hoja
En el rbol de ejemplo, borrar el nodo 3.

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'.

Ejemplo 2: Borrar un nodo rama con intercambio de un nodo hoja.


En el rbol de ejemplo, borrar el nodo 4. 1. Localizamos el nodo a borrar ('raz'). 2. Buscamos el nodo ms a la derecha del rbol izquierdo de 'raz', en este caso el 3, al tiempo que mantenemos un puntero a 'Padre' a 'nodo'. 3. Intercambiamos los elementos 3 y 4. 4. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. 5. Borramos el 'nodo'.

Gua

Pgina

Universidad de Sonsonate Programacin III

2013

Ejemplo 3: Borrar un nodo rama con intercambio de un nodo rama.


Para este ejemplo usaremos otro rbol. En ste borraremos el elemento 6.

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

Universidad de Sonsonate Programacin III


1. Localizamos de nuevo el nodo a borrar ('raz').

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'.

Este comportamiento asegura que seguir siendo un ABB

Gua

Pgina

Universidad de Sonsonate Programacin III

2013

Recorrido a travs de un rbol

Gua

Pgina

Universidad de Sonsonate Programacin III


Dems mtodos para el funcionamiento del rbol. #include "Nodo.h" class Arbol{ private: pnodo raiz; pnodo actual; int contador; bool vacio(pnodo ele){ return (ele==NULL); } void auxContador(Nodo *nodo){ contador++; if(nodo->izquierdo) auxContador(nodo->izquierdo); if(nodo->derecho) auxContador(nodo->derecho); } void Podar(Nodo *nod){ if(nod) { Podar(nod->izquierdo); Podar(nod->derecho); delete nod; nod = NULL; } } public: Arbol(){ this->actual=NULL; this->raiz=NULL; this->contador=0; } ~Arbol(){ Podar(raiz); raiz=NULL; } void PodarArbol(){ Podar(raiz); cout<<"El Arbol Fue podado exitosamente\n";

2013

Gua

Pgina

Universidad de Sonsonate Programacin III


raiz=NULL; } bool arbolvacio(){ return vacio(raiz); }

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; } } }

bool EsHoja(Nodo *no){ return(no->derecho == NULL && no->izquierdo == NULL); }

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

Universidad de Sonsonate Programacin III


} } return -1; } int NumeroNodos(){ contador = 0; auxContador(raiz); return contador; } };

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

You might also like