You are on page 1of 6

Captulo 7 rboles binarios de bsqueda (ABB)

^
7.1 Definicin
^
Se trata de rboles de orden 2 en los que se cumple que para cada nodo, el valor de la
clave de la raz del subrbol izquierdo es menor que el valor de la clave del nodo y que
el valor de la clave raz del subrbol derecho es mayor que el valor de la clave del nodo.

rbol binario de bsqueda
7.2 Operaciones en ABB
^
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.
o Derecha.
o Raiz.
Informacin:
o Comprobar si un rbol est vaco.
o Calcular el nmero de nodos.
o Comprobar si el nodo es hoja.
o Calcular la altura de un nodo.
o Calcular la altura de un rbol.
7.3 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.
7.4 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.
o 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.
o 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.
7.5 Borrar un elemento
^
Para borrar un elemento tambin nos basamos en el algoritmo de bsqueda. Si el
elemento no est en el rbol no lo podremos borrar. Si est, hay dos casos posibles:
1. Se trata de un nodo hoja: en ese caso lo borraremos directamente.
2. Se trata de un nodo rama: en ese caso no podemos eliminarlo, puesto
que perderamos todos los elementos del rbol de que el nodo actual es
padre. En su lugar buscamos el nodo ms a la izquierda del subrbol
derecho, o el ms a la derecha del subrbol izquierdo e intercambiamos
sus valores. A continuacin eliminamos el nodo hoja.
Necesitamos un puntero auxiliar para conservar una referencia al padre del nodo raz
actual. El valor inicial para ese puntero es NULL.
Padre = NULL
Si el rbol est vaco: el elemento no est en el rbol, por lo tanto
salimos sin eliminar ningn elemento.
(1) Si el valor del nodo raz es igual que el del elemento que buscamos,
estamos ante uno de los siguientes casos:
o El nodo raz es un nodo hoja:
Si 'Padre' es NULL, el nodo raz es el nico del
rbol, por lo tanto el puntero al rbol debe ser
NULL.
Si raz es la rama derecha de 'Padre', hacemos
que esa rama apunte a NULL.
Si raz es la rama izquierda de 'Padre', hacemos
que esa rama apunte a NULL.
Eliminamos el nodo, y salimos.
o El nodo no es un nodo hoja:
Buscamos el 'nodo' ms a la izquierda del rbol
derecho de raz o el ms a la derecha del rbol
izquierdo. Hay que tener en cuenta que puede
que slo exista uno de esos rboles. Al mismo
tiempo, actualizamos 'Padre' para que apunte al
padre de 'nodo'.
Intercambiamos los elementos de los nodos raz
y 'nodo'.
Borramos el nodo 'nodo'. Esto significa volver
a (1), ya que puede suceder que 'nodo' no sea un
nodo hoja. (Ver ejemplo 3)
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.
Ejemplo 1: Borrar un nodo hoja
En el rbol de ejemplo, borrar el nodo 3.
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'.

Borrar un nodo hoja
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'.

Borrar con intercambio de nodo hoja
Ejemplo 3: Borrar un nodo rama con intercambio de un nodo rama.
Para este ejemplo usaremos otro rbol. En ste borraremos el elemento 6.

rbol binario de bsqueda
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.

Borrar con intercambio de nodo rama (1)
5. Localizamos de nuevo el nodo a borrar ('raz').
6. 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'.
7. Intercambiamos los elementos 6 y 16.
8. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte
a NULL.
9. Borramos el 'nodo'.

Borrar con intercambio de nodo rama (2)
Este modo de actuar asegura que el rbol sigue siendo ABB.

You might also like