Está en la página 1de 10

ESTRUCTURAS DE DATOS

UNIDAD TRES - SEMANA SEIS


ÁRBOLES BINARIOS ORDENADOS BALANCEADOS *

TABLA DE CONTENIDO

1. INTRODUCCIÓN 2
2. ÁRBOLES AVL (ÁRBOLES BALANCEADOS POR ALTURA) 2
2.1. DEFINICIÓN 2
2.2. OPERACIONES BÁSICAS 4
2.2.1. ALGORITMO DE BÚSQUEDA 4
2.2.2. ALGORITMO DE INSERCIÓN 4
2.2.3. ALGORITMO DE ELIMINACIÓN 7
3. ÁRBOLES PERFECTAMENTE BALANCEADOS (BALANCEADOS POR PESO) 8
4. ÁRBOLES ROJI-NEGROS 8
EN RESUMEN 10
PARA TENER EN CUENTA 10

*
Resumen del libro Estructuras de Datos en Java de Alejandro Sotelo Arévalo, cuya publicación está pendiente.

ESTRUCTURAS DE DATOS 1
1. INTRODUCCIÓN

En la lectura anterior concluimos que las operaciones básicas de búsqueda, inserción,


eliminación y modificación sobre los árboles binarios ordenados tienen complejidad
temporal , donde es la altura del árbol. Además sabemos que, dado un árbol con peso
, la altura mínima que puede tener es la parte entera de y la altura máxima que
puede tener es .

Como es posible que los árboles binarios ordenados se degeneren alcanzando una altura
similar a su peso, entonces la complejidad temporal de las operaciones básicas se podría
degradar a (recuerde que un árbol degenerado cumple que su altura es igual a su
peso). Para no degradar la eficiencia es necesario balancear los árboles, procurando que todo
nodo tenga aproximadamente la mitad de sus descendientes a la izquierda y el resto de
descendientes a la derecha. Estudiaremos tres tipos de árboles binarios ordenados
balanceados que son capaces de garantizar complejidades logarítmicas sobre las operaciones
básicas de búsqueda, inserción, eliminación y modificación: los árboles AVL, los árboles
perfectamente balanceados, y los árboles Roji-negros.

2. ÁRBOLES AVL (ÁRBOLES BALANCEADOS POR ALTURA)

La teoría expuesta en esta sección está inspirada en el libro Diseño y Manejo de Estructuras
de Datos en C de Jorge Villalobos †.

2.1. DEFINICIÓN

Un árbol AVL (también conocido como árbol balanceado por altura) se puede definir
recursivamente así:
1. El árbol vacío es un árbol AVL, por definición.
2. El árbol no vacío
val val : raíz

izq : subárbol izquierdo

izq der der : subárbol derecho

es un árbol AVL si se cumplen las siguientes condiciones:


Es un árbol binario ordenado.
La altura de sus dos subárboles no difiere en más de uno:


VILLALOBOS, Jorge A. Diseño y Manejo de Estructuras de Datos en C. Bogotá: McGraw-Hill, 1996.

ESTRUCTURAS DE DATOS 2
Es decir, la altura del subárbol derecho menos la altura del subárbol izquierdo está entre
y .
Tanto el subárbol izquierdo como el subárbol derecho son árboles AVL.

El factor de balanceo por altura de un nodo es la altura de su subárbol derecho menos la


altura de su subárbol izquierdo:
.

Dado un árbol, un factor de balanceo de significa que sus dos subárboles tienen igual
altura, un factor de balanceo de significa que su subárbol izquierdo tiene niveles más
de altura que su subárbol derecho, y un factor de balanceo de significa que su subárbol
derecho tiene niveles más de altura que su subárbol izquierdo.

Gráfica 1: Procedimiento mnemotécnico para el cálculo de los factores de balanceo por altura.

Un árbol AVL se puede definir como un árbol binario ordenado tal que todos sus nodos
tienen un factor de balanceo por altura entre menos uno y uno.

Tabla 2: Ejemplo de árboles AVL y no AVL.


Ejemplo ¿Es AVL?
Sí, porque es el árbol vacío.

Sí, porque está ordenado y todos sus nodos tienen factores de


balanceo por altura que están entre y .

No, porque hay nodos cuyos factores de balanceo por altura no


están entre y .

Todo árbol AVL cumple que donde es el peso y es la altura del árbol.

ESTRUCTURAS DE DATOS 3
2.2. OPERACIONES BÁSICAS

2.2.1. ALGORITMO DE BÚSQUEDA

Como todo árbol AVL es también un árbol binario ordenado, el algoritmo de búsqueda es el
mismo que ya estudiamos para árboles binarios ordenados, que tiene complejidad temporal
donde es la altura del árbol. Gracias a que en todo árbol AVL se cumple que
, entonces la complejidad temporal del algoritmo de búsqueda sería
en todo caso.

2.2.2. ALGORITMO DE INSERCIÓN

Para insertar un valor x en un árbol AVL:


1. Inserte el valor x en el árbol siguiendo el proceso de inserción descrito para árboles
binarios ordenados comunes y corrientes.
2. Si después de la inserción el árbol sigue cumpliendo la condición de ser AVL, entonces no
realice ninguna operación.
3. De lo contrario, si después de la inserción el árbol no cumple la condición de ser AVL,
entonces:
3.1. Identifique el nodo de mayor nivel que no tiene un factor de balanceo por altura entre
y (es decir, identifique el nodo de más abajo que se desbalanceó por altura).
3.2. Corrija el árbol mediante operaciones denominadas rotaciones, que son capaces de
rebalancearlo para que vuelva a adquirir la condición de ser AVL, bajo cuatro escenarios
posibles:
3.2.1. Caso Izq-Izq (Izquierda-Izquierda):
e -1 e -2
f 0 insertar x f -1 La inserción se efectúa en el
c c
 subárbol a, aumentando su altura

a b b
2
a

Este escenario sucede cuando la inserción del valor x se efectúa a la izquierda de la izquierda
del nodo que se desbalanceó. Para arreglar el árbol se debe realizar una rotación a la derecha
sobre el nodo e.
e -2 f 0
f -1 rotación e 0
derecha Se rota a la derecha el nodo e
c
b a b c
a

ESTRUCTURAS DE DATOS 4
3.2.2. Caso Der-Der (Derecha-Derecha):
e +1 e +2
f 0 insertar x f +1 La inserción se efectúa en el
 subárbol c, aumentando su altura
a a
b c b
2
c

Este escenario sucede cuando la inserción del valor x se efectúa a la derecha de la derecha
del nodo que se desbalanceó. Para arreglar el árbol se debe realizar una rotación a la
izquierda sobre el nodo e.
e +2 f 0
f +1 rotación e 0
izquierda Se rota a la izquierda el nodo e
a
b a b c
c
3.2.3. Caso Izq-Der (Izquierda-Derecha):
e -1 e -2
f 0 f +1 La inserción se efectúa en el
insertar x
subárbol b1 o en el subárbol b2,
g?  aumentando su altura
c c
a b a 2
b1 b2

Este escenario sucede cuando la inserción del valor x se efectúa a la derecha de la izquierda
del nodo que se desbalanceó. Para arreglar el árbol se debe realizar una rotación a la
izquierda sobre el nodo f y luego una rotación a la derecha sobre el nodo e,
independientemente de si la inserción afectó el subárbol b1 o el subárbol b2.
e -2 e -2 g 0
Se rota a la izquierda
f +1 rotación g -1 rotación f? e? el nodo f, y luego se
g? izquierda f? derecha se rota a la derecha
c c
el nodo e
a b2 a b1 b2 c
b1 b2 a b1
3.2.4. Caso Der-Izq (Derecha-Izquierda):
e +1 e +2
f 0 f -1 La inserción se efectúa en el
insertar x
subárbol b1 o en el subárbol b2,
a a
g?  aumentando su altura
b c c
2
b1 b2

Este escenario sucede cuando la inserción del valor x se efectúa a la izquierda de la derecha
del nodo que se desbalanceó. Para arreglar el árbol se debe realizar una rotación a la derecha
sobre el nodo f y luego una rotación a la izquierda sobre el nodo e, independientemente de
si la inserción afectó el subárbol b1 o el subárbol b2.

ESTRUCTURAS DE DATOS 5
e +2 e +2 g 0
Se rota a la derecha
f -1 rotación g +1 rotación e? f? el nodo f, y luego se
g? derecha f? izquierda se rota a la izquierda
a a
el nodo e
c b1 a b1 b2 c
b1 b2 b2 c

Tabla 3: Ejemplo que ilustra cómo insertar valores en un árbol AVL.


Evolución del árbol durante la operación Caso Operación
Insertar
2.
el valor
Insertar
2.
el valor

3.2.1. Insertar
(Izq-Izq) el valor

Insertar
2.
el valor

3.2.2. Insertar
(Der-Der) el valor

3.2.3. Insertar
(Izq-Der) el valor

ESTRUCTURAS DE DATOS 6
Gracias a que en todo árbol AVL se cumple que , entonces la complejidad
temporal del algoritmo de inserción sería en todo caso.

2.2.3. ALGORITMO DE ELIMINACIÓN

Para eliminar un valor x de un árbol AVL:


1. Elimine el valor x del árbol siguiendo el proceso de eliminación descrito para árboles
binarios ordenados comunes y corrientes.
2. Para todo nodo que sea ancestro del nodo eliminado, comenzando desde tal nodo y
terminando en el nodo correspondiente a la raíz del árbol:
2.1.1. Si el nodo tiene un factor de balanceo por altura entre y : deje el nodo intacto.
2.1.2. Si el nodo no tiene un factor de balanceo por altura entre y : corrija el nodo
mediante las rotaciones explicadas en el algoritmo de inserción, identificando cuál de sus
subárboles causó el desbalanceo.

Es posible que después de una eliminación se requiera corregir con rotaciones más de un
nodo.

Tabla 4: Ejemplo que ilustra cómo eliminar valores de un árbol AVL.


Evolución del árbol durante la operación Caso Operación

Izq-Der
(aunque también Eliminar
se puede aplicar el valor
Izq-Izq)

ESTRUCTURAS DE DATOS 7
Eliminar
Izq-Izq
el valor

Eliminar
el valor

Gracias a que en todo árbol AVL se cumple que , entonces la complejidad


temporal del algoritmo de eliminación sería en todo caso.

3. ÁRBOLES PERFECTAMENTE BALANCEADOS (BALANCEADOS


POR PESO)

Un árbol perfectamente balanceado es un árbol binario ordenado tal que todos sus nodos
tienen un factor de balanceo por peso entre menos uno y uno, donde el factor de balanceo
por peso de un nodo es el peso de su subárbol derecho menos el peso de su subárbol
izquierdo:

Los algoritmos de inserción y de eliminación en árboles perfectamente balanceados no serán


trabajados en esta lectura debido a la dificultad que representan.

4. ÁRBOLES ROJI-NEGROS

Los árboles Roji-negros son otro tipo de árboles ordenados balanceados que proveen
complejidades logarítmicas para las operaciones básicas de búsqueda, inserción,
eliminación y modificación.

Un árbol Roji-negro (conocido en inglés como Red-black tree) es un árbol binario que cumple
las siguientes propiedades:
1. Es un árbol ordenado.

ESTRUCTURAS DE DATOS 8
2. Todos sus nodos están coloreados de rojo o de color negro (el color es un atributo de los
nodos de un árbol Roji-negro, que sólo puede tomar dos posibles valores: rojo o negro).
3. Su raíz está coloreada de negro.
4. Todos sus subárboles vacíos están coloreados de negro y son considerados como nodos del
árbol cuyo valor almacenado es null.
5. Todos los hijos de un nodo coloreado de rojo deben estar coloreados de negro.
6. Todos los caminos que parten de un nodo y llegan a un subárbol vacío deben pasar por la
misma cantidad de nodos coloreados de negro.

Muchos textos usan el término hoja en vez de subárbol vacío en la definición. Preferiremos
designar los nodos terminales con el término subárbol vacío para ser coherentes con la
terminología que hemos estado empleando en toda la teoría, trataremos los subárboles
vacíos como nodos, y permitiremos colocar el subárbol vacío en los caminos de nodos.
Suponga en los ejemplos que el árbol vacío ya está coloreado de negro por defecto.

Las restricciones de la definición obligan a que en un árbol Roji-negro, la longitud del camino
más largo que va de la raíz hacia cualquier subárbol vacío no sea mayor que el doble de la
longitud del camino más corto que va de la misma raíz a cualquier otro subárbol vacío. La
razón es la siguiente: debido a que todos los caminos desde la raíz hacia cualquier subárbol
vacío tienen la misma cantidad de nodos negros y que no puede haber ningún camino con
dos nodos rojos consecutivos, entonces el camino más corto posible estaría compuesto
únicamente por nodos negros (negro-negro-…-negro) y el camino más largo posible estaría
compuesto por nodos negros y nodos rojos de forma alternada (negro-rojo-negro-…-
rojo-negro).

Tabla 5: Ejemplos de árboles Roji-negros y no Roji-negros.


Ejemplo ¿Es Roji-negro?
Sí, porque es el árbol vacío y está coloreado de negro.
No, porque no todos los caminos que van desde el hasta
un subárbol vacío pasan por la misma cantidad de nodos
negros: por ejemplo, el camino pasa por dos
nodos negros, y los caminos , ,
y pasan por tres nodos
negros cada uno (incluyendo el vacío).

Sí. Observe que todos los caminos que van desde el hasta
un subárbol vacío pasan por exactamente cuatro nodos
negros (incluyendo el vacío).

ESTRUCTURAS DE DATOS 9
Todo árbol Roji-negro cumple que , donde es el peso y es la altura del
árbol. Se tiene entonces que los árboles AVL están más estrictamente balanceados que los
árboles Roji-negros porque la altura de todo árbol AVL está acotada por .

El algoritmo de búsqueda es el mismo que ya estudiamos para árboles binarios ordenados, y


tiene complejidad temporal porque sabemos que nunca visita más de nodos y
que en todo árbol Roji-negro se cumple que . En el enlace
http://en.wikipedia.org/wiki/Red-Black_tree de la Wikipedia y en el libro Introduction to
Algorithms de Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, y Clifford Stein se
tratan con detalle procesos de inserción y eliminación de valores sobre árboles Roji-negros,
que tienen complejidad temporal y que garantizan que el árbol no pierda su
condición de ser Roji-negro.

Más adelante aprenderemos a manipular las clases TreeSet<E> y TreeMap<K,V> de la librería


estándar de Java, que implementan los árboles Roji-negros.

EN RESUMEN
Un árbol AVL es un árbol binario ordenado tal que todos sus nodos tienen un factor de balanceo por
altura entre menos uno y uno. Un árbol perfectamente balanceado es un árbol binario ordenado tal
que todos sus nodos tienen un factor de balanceo por peso entre menos uno y uno.
Los árboles AVL, los árboles perfectamente balanceados y los árboles Roji-negros son estructuras de
datos que permiten buscar, insertar, eliminar y modificar datos con complejidad logarítmica
( ).

PARA TENER EN CUENTA


Más adelante estudiaremos las clases TreeSet<E> y TreeMap<K,V>, que implementan los árboles
Roji-negros para representar conjuntos y asociaciones llave-valor, respectivamente.

ESTRUCTURAS DE DATOS 10

También podría gustarte