Anda di halaman 1dari 8

9-7-2015 a 15-7-2015

Unidad 4
Pioquinto Hugo Nava Castro

Luis Alberto Rosas Jaime


11011358

rboles
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
en
en
en

el
el
el
el

subrbol
subrbol
subrbol
subrbol

izquierdo del hijo izquierdo de X


derecho de hijo izquierdo
izquierdo del hijo derecho
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:
1- Cada nodo est coloreado rojo o negro
2- La raz es negra
3- Si un nodo es rojo, los hijos deben ser negros (no se permiten dos rojos seguidos en
un path)
4- 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

a
A
B C

X
X
X
X
X
X
X
X
X
X

X
X
X
X
X
X
X
X
X
X

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

a
t

X
X
X
X
X
X
X
X
X
X

X
X
X
X
X
X
X
X
X
X

p
A

B
C
D
E
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

p
x

A
B C

x
t

x
B

A
C

X
X
X
X
X
X
X
X
X
X

X
X
X
X
X
X
X
X
X
X

p
A

X
X
X
X
X
X
X
X
X
X

X
X
X
X
X
X
X
X
X
X

C
D

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.