Professional Documents
Culture Documents
Habamos visto que se puede demostrar por induccin que en un rbol completo el nmero de nodos totales es
(2 ** h+1) 1. Esto nos indica que las cosas que se hacen en rboles son de orden log n pero slo en el caso en
que el rbol est lleno. En el peor de los casos las cosas pueden ser lineales O(n). Cmo poder garantizar,
entonces que se mantenga un balanceo? Cada vez que debido a una insercin o eliminacin el rbol se
desbalancee, reubicar los nodos de modo que, manteniendo el invariante de un rbol de bsqueda binaria,
se trate de mantener la altura del rbol. Ej:
El primer tipo de rboles balanceados fue el AVL (Adelson Velskii Landis). No son frecuentemente implementados,
ya que hay otros mejores, pero las ideas que hay detrs de ellos se ven en los dems tipos de rboles balanceados. Se
trata de incluir otra condicin ms en el invariante de modo de asegurar que la bsqueda sea O(log n): LO ms
simple sera requerir que para un rbol AVL la altura de su subrbol derecho sea igual a la de su subrbil izquierdo.
Recordemos que los rboles se definen recursivanmete, por lo tanto esto se debera cumplir para cada nodo. Esto es
sin embargo muy restrictivo ya que implicara que todo rbol AVL debera ser completo adems. La definicin de
rboles AVL es entonces algo ms relajada:
Def: Un rbol AVL es un rbol binario con la propiedad adicional que para cualquier nodo
En el rbol la altura de su subrbol izquierdo y de su subrbol derecho difieren a lo ms en 1.
Esta condicin asegura que el rbol slo tendr altura logartmica. Para probar esto necesitamos mostrar que un rbol
de altura H tiene por lo menos C**H nodos para alguna constante H>1. En otras palabras, si el mnimo nmero de
nodos en un rbol es exponencial a su altura, entonces la mxima altura de un rbol con N elementos es dada por Log
en base C de N. Esto se puede probar con los nmeros de Fibonacci:
Sea S(H) un rbol AVL con altura H y con el mnimo de elementos para esa altura. Entonces S(0) = 1 y S(1) = 2.
Ahora, por la condicin de un rbol AVL sabemos que un rbol AVL mnimo de altura H tiene como hijos uno
mnimo de altura H-1 y otro mnimo de altura H-2, ya que el desbalanceo puede ser a lo ms de 1. Del dibujo
podemos ver que la cantidad de nodos de este rbol es S(H) = S(H-1) + S(H-2) + 1. Ahora los nmeros de Fibonacci
eran F(N) = F(N-1)+F(N-2) con F(0) = 1 y F(1) = 1. Corrigiendo: S(H) = F(H+3). Ahora, se sabe que el fibonacci de
un nmero i es alrededor de (K**i)/sqrt(5) con K alrededor de 1.618 (o sea > 1). Consecuentemente un rbol AVL de
altura H tiene a lo menos (gruesamente estimando) K**(H+3)/sqrt(5), por lo cual la altura para un rbol AVL mnimo
es logartmica con respecto al nmero de nodos. Esto implica que las operaciones sobre un rbol AVL estn acotadas
logaritmicamente.
Pero esto no se logra gratis, el costo es la complicacin de las operaciones insertar y eliminar ya que estas son las que
pueden desbalancear un rbol. Una observacin clave es que es que despus de una insercin slo los nodos que
estaban en el recorrido desde la raz hasta el lugar de insercin pueden resultar desblanceados. Al volver
recursivamente hacia la raz despus de haber insertado o eliminado un nodo es posible encontrar nodos cuyo nuevo
balance viole el principio de rbol AVL.
Para hacer ms fcil este control, los nodos de un rbol AVL adems de tener la informacin normal (el elemento)
tiene adems un nmero de balanceo que es la diferencia de alturas entre el rbol izquierdo y el rbol derecho
(altura(izq) atura(der)).
Veamos los casos de insercin que pueden desbalancear un rbol AVL. Un nodo X podria necesitar ser rebalanceado
si se inserta un nuevo nodo:
1234-
Caso 1
Caso 4
Caso 2
Caso 3
Para resolver el caso 1 y 4 de los nodos externos se hace lo que se llama rotacin simple (ej pag 513).
Para los casos 2 y 3 de los nodos internos se hace la llamada rotacin doble (ej pag 515)
P
A
B
ARBOLES ROJO-NEGRO
Tienen la gracia de que se puede balancear mientras se va hacia abajo (no se necesita el paso de vuelta hacia arriba
por lo cual no se necesita hacerlo en forma recursiva). Como resultado la implementacin es ms simple y rpida que
el AVL. Los rojo-negro tienen las siguientes caractersticas:
1234-
t
C
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
x
x
B
A
B
D
Aunque x es una hoja y en ese caso t es null, hemos dibujado un caso ms general para usar esto ms adelante.
Para el caso de una insercin como nodo interno: rotacin doble.
a
x
t
x
B
a
t
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
C
D
Antes de continuar tenemos que estar seguros que esto funciona tambin para el caso general (en que X no es hoja).
Primero podemos ver que se mantienen las condiciones de rojo-negro intercalados y tambin la de los nodos negros
en los paths ya que se conservo la cantidad de nodos negros (dos a la derecha, 1 a la izquierda). Tambin se puede
ver que las races de A,B,C y D deberan haber sido originalmente negras (o null) si todo estaba en orden antes de
aparecer X.
OK, hasta aqu, pero qu pasa si el to era rojo? Bueno, se ve que esto tambin se puede arreglar:
a
t
C
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
x
x
B
A
B
D
a
x
t
a
t
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
p
A
Aunque todo esto parece funcionar queda una pregunta: qu pasa si el padre de a era originalmente rojo? Bueno,
aqu podemos hacer los mismos anlisis que hemos hecho hasta ahora. Esta vez s que tiene sentido tener en cuenta
lo del caso general, o sea que estamos tratando con nodos internos.
Insercin top-down en rboles rojo-negro
Para evitar la necesidad de tener que estar rotando el rbol cuando se vaya hacia arriba de vuelta de haber hecho una
insercin podemos usar un truco cuando vayamos hacia abajo de modo de asegurar que cuando se llega al lugar que
se debe insertar, el to nunca ser rojo por lo cual bastar con insertar una hoja roja y hacer a lo ms una rotacin
(simple o doble).
El procedimiento se basa en lo siguiente: mientras se va hacia abajo, si vemos un nodo x que tiene dos hijos rojos
cambiamos x a rojo y hacemos los hijos negros.
X
Es claro que el nmero de nodos negros bajo x permanece inalterado. El problema es que si el padre de x era rojo
tenemos dos rojos consecutivos. En teste caso podemos aplicar las rotaciones simple o doble vistas anteriormente, en
las cuales haba un to negro, dependiendo de dnde se encuentra x (estas no suben un nodo rojo as que no par
ms). Pero qu pasa si el to es rojo ! ah si se pasa un nodo rojo hacia arriba !. Esto no puede pasar ya que en el viaje
hacia abajo si se encontr que el abuelo tena dos hijos rojos se cambiaron a negros.
Ejemplo: cuadros 18.34 (pg 517) se quiere poner el 45cuando bajamos vemos que el 50 tiene dos hijos rojos. Esto
se cambia (ver cuadro 18.39 en pg. 520). Esto produce que el 60 y el 50 queden sucesivamente rojos. Se hace una
rotacin simple (ver cuadro 18.40 en pagina del lado) y luego se puede poner el 45 sin problemas.