You are on page 1of 7

rboles balanceados

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-

en el subrbol izquierdo del hijo izquierdo de X


en el subrbol derecho de hijo izquierdo
en el subrbol izquierdo del hijo derecho
en el subrbol derecho del hijo derecho

Caso 1

Caso 4

COMO ESTN LOS


INDICADORES DE BALANCE ?

Caso 2

Caso 3

COMO ESTN LOS


INDICADORES DE BALANCE ?

En el caso 1 y 4 se habla de un nodo externo causando el desbalanceo. En el caso 2 y 3 de uno interno.

Para resolver el caso 1 y 4 de los nodos externos se hace lo que se llama rotacin simple (ej pag 513).

Static NodoArbol rotHijoIzq(NodoArbol p) {


NodoArbol q = p.izq;
p.izq = q.der;
q.der = p; p.bal = 0; q.bal = 0;
return q;
}

Static NodoArbol rotHijoDer(NodoArbol p) {


NodoArbol q = p.der;
p.der = q.izq;
q.izq = p; p.bal = 0; q.bal = 0;
return q;
}

Para los casos 2 y 3 de los nodos internos se hace la llamada rotacin doble (ej pag 515)
P

A
B

Static NodoArbol dobleConIzq(NodoArbol p) {


NodoArbol q = p.izq, r = q.der;
q.der = r.izq; p.izq = r.der;
r.izq = q; r.der = p;
if (r.bal > 0) { // B era mas alto que C
q.bal = 0; r.bal = 1; p.bal = -1;
}
}
Insercin en AVL.
La manera ms simple es un algoritmo recursivo: Para insertar un elemento X hacemos un algoritmo recursivo
(como el conocido para binarios) que inserta en el lugar preciso. El subrbol formado por el nodo recin creado es
1ms alto que el antiguo as que debe informar de esto a su padre para que recalcule el factor de balance. Si al
calcularlo el padre ve que se mantiene el balance, est todo en orden pero debe informar a su padre que creci en uno
para que este recalcule tambin. Si en algn momento se ve un desbalance que no se puede tolerar se realiza la
rotacin necesaria. Desde ese momento no es necesario informar de crecimiento de rbol hacia arriba ya que se
volvi la altura original.

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-

Cada nodo est coloreado rojo o negro


La raz es negra
Si un nodo es rojo, los hijos deben ser negros (no se permiten dos rojos seguidos en un path)
Cualquier path desde la raz hasta una referencia null debe contener el mismo nmero de nodos negros

Ver ejemplo en pg 517.


Se puede demostrar por induccin que si todo path desde la raz hasta una referencia null tiene B nodos negros,
entonces tiene que haber por lo menos (2**B)-1 nodos negros en el rbol. Ms an, como la raz es negra y no
pueden haber dos nodos consecutivos rojos en el path, la altura de un rbol rojo-negro es a lo ms 2*log(N+1)
(intercalemos un nodo rojo en alguno de los path cada nodo negro). Consecuentemente, la bsqueda est garantizada
de ser logartmica.
Insercin, primera aproximacin: botton up
Recordemos que todo nodo nuevo se inserta como una hoja en un rbol. Si la coloreamos negra entonces de seguro
estaremos violando la propiedad 4 ya que habr un path a una referencia null con un nodo negra ms (en realidad 2).
Insertemos la hoja nueva de color rojo. Si el padre era negro est todo bien y hasta aqu llega el problema. Si el padre
ya era rojo entonces estamos en problemas, pero con rotaciones y cambios de colores es posible solucionar esto.
Hay varios casos a considerar (y sus espejos) si el padre era rojo:
Primero consideremos que el tio era negro o null. Si llamamos x al nuevo nodo, p al padre, a al abuelo y t al tio
podemos hacer una rotacin y un cambio de colores que nos dejar todo en orden de nuevo. Slo p y x pueden ser
rojos en este caso porque si a fuera rojo hubiese una situacin no vlida ANTES de insertar. Ahora podemos usar la
terminologa de los rboles AVL y decir que el nodo nuevo x puede ser externo o interno. Si es externo una rotacin
simple y un cambio de color de p y de a arreglan la cosa:
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

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.

You might also like