Sie sind auf Seite 1von 27

1

Captulo 11

rboles binarios balanceados de bsqueda. AVL.


El alto de un rbol es el largo de la trayectoria ms larga de una hoja hasta la raz. Adel'son-Vel'skii y Landis (1962) definieron rboles AVL en los cuales, para cada nodo, el alto del subrbol derecho difiere del alto del subrbol izquierdo a lo ms en uno. El desarrollo del algoritmo muestra la necesidad de un anlisis exhaustivo de los diferentes casos que se presentan. Dicho anlisis facilita la posterior codificacin.

11.1 Anlisis de complejidad.


Se define el factor de balance como el alto del subrbol derecho menos el alto del subrbol izquierdo. Entonces en un rbol AVL, todos los nodos cumplen la propiedad de tener valores del factor de balance iguales a: -1, 0, +1. Sea nh el mnimo nmero de nodos en un rbol AVL de altura h dada, que se encuentra en su peor caso de desbalance, si se agrega un nodo, tal que la nueva altura sea (h+1), dejan de ser AVL. Los siguientes diagramas ilustran dichos rboles, denominados de Fibonacci, y los factores de balance de sus nodos, para alturas 0, 1 y 2. Se muestran todos los casos, separados por un eje de simetra; a la derecha del eje se muestran los desbalanceados por la derecha; y a la izquierda los desbalanceados por la izquierda. Las imgenes en ambos lados del eje se obtienen como imgenes especulares de las del otro lado. Lo que se desea encontrar es la altura mxima h de todos los rboles balanceados de n nodos. Para resolver esto se da una altura h determinada y se intenta construir rboles balanceados AVL con el mnimo nmero de nodos, stos son los rboles de Fibonacci.

Profesor Leopoldo Silva Bijit

26-05-2008

2 n0 = 1 n1 = 2
0

Estructuras de Datos y Algoritmos

-1 0

1 0

h=1

Figura 11.1 rboles Fibonacci AVL, con alturas 0, 1. n2 = 4


-1 1 0 0 0 -1 -1 0 0 1 1 0 0 1 -1 0

Figura 11.1.a. rboles Fibonacci AVL, con altura 2. Se cumple que: n2 = n1 + n0 + 1

Se pueden generar 4 rboles de Fibonacci con altura dos. Existen adicionalmente varios rboles AVL de altura dos (los con 5, 6, y 7 nodos) pero se consideran ms balanceados que los de Fibonacci. Para construir el rbol de Fibonacci de altura h, a la raz se agrega un subrbol de altura (h-1) y otro de altura (h-2). La Figura 11.2 ilustra un ejemplo, de los 16 posibles, de la generacin de un rbol de Fibonacci de altura 3, mediante dos subrboles de altura 1 y 2. n3 = 7 Se tiene: n3 = n2 + n1 + 1
1 1 0 1 0 1 0

h=3

Figura 11.2 Ejemplo rbol AVL Fibonacci, con altura 3. Se destaca el hecho de que estos rboles son el peor caso: logran mxima altura, con el mnimo nmero de nodos.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL n4 = 12 Se tiene n4 = n3 + n2 + 1

Como ejemplo de rbol con altura 4, a la raz se agrega por la derecha un rbol de Fibonacci de altura 3, y por la izquierda uno de altura 2, resulta la Figura 11.3.
1

1 0 1 0_ 1 0

1 1 0 1 0

Figura 11.3 rbol AVL Fibonacci, con altura 4. Mediante induccin puede demostrarse que en general, se tiene la recurrencia:

nh

nh

nh

1 con n0

1 y n1

Lo cual implica que un rbol AVL est formado por dos subrboles AVL. La secuencia generada es: 1, 2, 4, 7, 12, 20, 33, 54 para h=0, 1, 2. Empleando el siguiente comando Maple, se puede obtener la solucin de la recurrencia:
> n[h]:= rsolve( { n(h) = n(h-1) + n(h-2) + 1, n(0)=1,n(1)=2}, n(h));

El trmino general de la serie n(h) es:

1 nh := 5

1 5 5 1 1 1 5

2 5

1 1
h

5 2 5 5 1

1 5 5 1 1 5

1 1
h

2 5

1 1 5

2 5

2 1

Evaluado numricamente:

n(h) 1.894427191(1.618033988)h +.1055728091(-.6180339886)h 1


El segundo trmino tiende a cero, segn muestra la secuencia: > seq( evalf(subs( h =j, .1055728091*(-.6180339886)^h)), j = 0..6);

Profesor Leopoldo Silva Bijit

26-05-2008

Estructuras de Datos y Algoritmos


.1055728091 , -.06524758430 , .04032522477 , -.02492235950 , .01540286525 , -.009519494246 , .005883370999

Finalmente, el nmero de nodos en funcin de la altura en un rbol de Fibonacci, resulta:

n(h) 1.894427191(1.618033988) h
El comando solve permite despejar h, en trminos de n. > solve(n=1.894427191*1.618033988^h,h); h (n)= 2.078086923

ln ( .5278640450 n )

Para acotar por arriba, se desea encontrar el valor de la constante c que satisface: c*ln(n)/ln(2)=2.078086923*ln(.5278640450*n) Resulta: c = 1.440420092 El factor que depende de n, tiende a uno: c= lim
n

ln( .5278640450 n ) ln( n )

1.440420092

ln ( .5278640450 ln ( n )

n)

1.440420092

Lo que tambin se aprecia en la grfica:

Figura 11.4 Cota AVL en funcin de n. Finalmente la altura en un rbol AVL queda acotada por: 1.440420092*log(n) > h(avl) > h(bst) Donde h(bst) es la altura de un rbol de bsqueda binario completamente balanceado: h(bst) = log(n+1)

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL Lo cual demuestra que: h(avl) = (log(n))

h=1,44..log(n) altura AVL

altura BST

Figura 11.5 Complejidad de la altura de un rbol AVL. La siguiente grfica muestra la diferencia de altura del rbol AVL, respecto de uno perfectamente balanceado, en funcin de n. Es decir la grfica del cuociente:

2, 07808ln(0,527864n) log 2 (n)

Figura 11.6 Alargue de altura rbol AVL, respecto de perfectamente balanceado Notar que para rboles con menos de 7000 nodos, la altura slo se alarga en cuatro. Otra forma de encontrar la solucin de la recurrencia para n(h), es relacionarla con la secuencia de Fibonacci, para la cual se conoce la solucin. La relacin para la recurrencia de Fibonacci es: F(i) = F(i 1) + F(i 2), F(0) = 0, F(1) = 1 La cual genera: 0, 1, 1, 2, 3, 5, 8, 13, para i=0, 1, 2. En el Ejemplo 4.6, se obtuvo, la solucin:

Profesor Leopoldo Silva Bijit

26-05-2008

Estructuras de Datos y Algoritmos

Empleando:

1 2

1 1 5 n ( ) 2 5 1 5 . Donde es la razn urea. 1, 61803.. se tiene que: 1 2 F ( n)


AC = AB A B C

1 1 5 n ( ) 2 5

Figura 11.6.a. Razn urea . Reemplazando en F(n), n por h, y empleando , se obtiene:

F (h)

1 ( )h 5

1 (1 5

)h

1 ( )h 5

Observando las dos secuencias de nmeros que generan n(h) y F(h), se encuentra: h n(h) F(h) F(h+3) Entonces, se tiene: n(h) = F(h + 3) 1. En forma aproximada, se tiene la solucin para n(h): 0 1 0 2 1 2 1 3 2 4 1 5 3 4 5 6 7 7 12 20 33 54 2 3 5 8 13 8 13 21 34 55

n ( h)

1 5

h 3

1 5

3 h 3 h

(1,894413.)

Resultado igual, al obtenido antes.

11.2. Anlisis de la insercin.


La funcin de insercin debe ser modificada para mantener la propiedad de rbol AVL. Existen inserciones que slo implican recalcular los factores de balance, ya que el rbol sigue siendo AVL. Por ejemplo las dos inserciones siguientes, en la Figura 11.7. izquierda, slo modifican los factores de balance de algunos nodos ancestros del insertado, que estn en la trayectoria del recin insertado hacia la raz.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL


recalculado recalculados 1

1 0 1 0_ 1 0

1 1 0 1 0
0

1 0 0 0_ 1 0

1 0 1 0 insertados 1 0

Figura 11.7 Inserciones que slo requieren recalcular factor de balance. 11.2.1. Detencin de revisin en ascenso. a) Al insertar por la izquierda, y en el proceso de ascenso, por la trayectoria desde el nodo recin insertado hacia la raz, revisando los factores de balance, si se llega a un nodo con factor uno, basta corregir el factor de ese nodo (quedando ste en 0) y no es preciso seguir corrigiendo en el ascenso. Esto debido a que ese nodo no cambiar su altura; estaba en h y queda en h. La figura 11.8 izquierda, ilustra una situacin general antes de la insercin por la izquierda; la figura 11.8 derecha, muestra despus de la insercin y de la correccin del factor de balance.
A h 1

A 0

detener

h -1

Figura 11.8 Detencin de revisin en ascenso. Caso a. 11.2.2. Continuar revisando factores de balance en ascenso. b) Al insertar por la izquierda, y en el proceso de ascenso de revisin de los factores de balance, si se llega a un nodo con factor cero, debe corregirse el factor de ese nodo (quedando ste en menos uno) y es preciso seguir el ascenso. Esto debido a que ese nodo cambi su altura; estaba en h y queda en h+1.

Profesor Leopoldo Silva Bijit

26-05-2008

8
A 0

Estructuras de Datos y Algoritmos


A -1

continuar

h+1
h h

Figura 11.9 Continuar revisin en ascenso. Caso b. La Figura 11.9, a la izquierda, ilustra la situacin antes de la insercin por la izquierda; la figura a la derecha muestra despus de la insercin y de la correccin del factor de balance. Pero la insercin deja el subrbol cumpliendo la propiedad AVL. Existen dos casos adicionales, que corresponden a inserciones por la derecha, y pueden visualizarse con las imgenes especulares de las mostradas. 11.2.3. Casos que producen desbalances. Otras inserciones producen desbalances que dejan al subrbol no AVL. Para encontrar en qu situaciones se producen desbalances que rompan la propiedad AVL, basaremos nuestro anlisis en el siguiente subrbol AVL, al cual si se le inserta un nodo en el subrbol derecho, quedar no AVL. Dada la estructura de un rbol AVL, el cual est formado por subrboles AVL, se analiza un rbol AVL de altura dos, pero el anlisis es vlido para cualquier subrbol AVL. Se escoge un caso sencillo para extraer de l, el caso general:
1 0 0 0 0

Figura 11.10 rbol AVL, para analizar prdida de propiedad AVL. Trataremos de insertar en posiciones que desbalanceen el rbol, notando que se deben recalcular los factores de balance, a travs de la trayectoria desde el nodo insertado hacia la raz, y si aparece uno con factor 2, se pierde la propiedad AVL. 11.2.3.1. Insercin externa por la derecha. c) Si se inserta nodo F, en la rama externa ms larga del subrbol derecho: La relacin de orden del rbol binario es: A<B<C<D<E<F

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL


2 0 A 0 B 1 C D 1 E 0 F

Figura 11.11 rbol no AVL, despus de insercin externa por la derecha. Se trata igual el caso: F<E. Inserciones de nodos con valores menores que B, mejoran los factores de balance, mantienen la propiedad AVL, y no existe necesidad de corregir. Han sido tratados en los casos a y b. Se detecta la prdida de propiedad AVL, para este caso, cuando el factor de balance de un nodo recalculado despus de la insercin es +2, y el factor de balance del hijo derecho de ste es positivo. 11.2.3.2. Insercin interna por la derecha. d) Si se inserta nodo D, en la rama interna ms larga del subrbol derecho. Con orden: A<B<C<D<E<F
2 0 A 1 B -1 C 0 E 0 D F

Figura 11.12 rbol no AVL, despus de insercin interna por la derecha. Se trata igual el caso D<C. Inserciones para nodos con valores menores que B, mejoran los factores de balance, y no existe necesidad de corregir. Esta situacin se detecta cuando el factor de balance de un nodo es +2, y el factor de balance del hijo derecho de ste es negativo. 11.3.4. Rotaciones para mantener propiedad AVL. Se analizan correcciones a los casos c y d, para mantener la propiedad AVL: El caso c) requiere una reestructuracin de los nodos para mantener la propiedad AVL. Manteniendo la relacin de orden: A<B<C<D<E<F, se denomina rotacin simple a la izquierda, la que deja al subrbol, segn:

Profesor Leopoldo Silva Bijit

26-05-2008

10
0 0 0 A B D 1 0 C E 0

Estructuras de Datos y Algoritmos

Figura 11.13 rbol AVL de Figura 11.11, despus de rotacin simple a la izquierda. El caso d) de la Figura 11.12, tambin requiere reestructurar para mantener el rbol con la propiedad AVL. Se corrige con una doble rotacin. Primero una a la derecha, que hace ascender C (la situacin despus de esta rotacin, se muestra en la parte izquierda de la Figura 11.14) y luego otra a la izquierda, que hace ascender C hasta la raz, despus de la cual se muestra en la Figura 11.14 a la derecha.
2 0 A B 2 C 0 0 D E

0 -1 0
0 F

C 0 0 D E 0 F

Figura 11.14 rbol AVL de la figura 11.12, despus de doble rotacin. En ambas se conserva la relacin de orden: A<B<C<D<E<F Existen dos casos adicionales, que corresponden inserciones por la izquierda, y pueden visualizarse con las imgenes especulares de las mostradas. 11.3.4.1. Correccin con rotacin simple en insercin. Se puede generalizar, el caso c) con el diagrama de la Figura 11.15. La figura a la izquierda ilustra la situacin antes de agregar un nodo en el subrbol derecho de B. La figura al centro muestra el rbol desbalanceado, no AVL. A la derecha se muestra despus de una rotacin simple a la izquierda, la cual mejora el balance y genera un rbol AVL.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL


A 1 B 0

11
A 2 B 1
positivo

B 0 A 0

h h h

h+1

h+1 h

Figura 11.15 Generalizacin de caso c). Rotacin simple. La rotacin a la derecha es la imagen especular de las figuras. Slo se afectan los factores de balance del trayecto ascendente desde el nodo insertado hacia la raz. 11.3.4.2. Correccin con rotacin doble en insercin. El caso d) tambin se puede generalizar. Si se agrega nodo en el subrbol izquierdo o derecho del nodo B , Figura 11.16 izquierda, se producirn cambios en los factores de balance, desde el nodo insertado hacia la raz. Ocasionando el desbalance que se muestra en la figura a la derecha, el rbol no es AVL.
A 1 C 0 B 0
B -1 A 2 C -1
negativo

h h-1 h-1

h h h-1

Figura 11.16 Generalizacin de caso d). Lo cual se corrige, con una rotacin a la derecha, que hace ascender B , Figura 11.17 izquierda, y luego otra a la izquierda para llevar B a la raz del subrbol, produciendo un rbol AVL.

Profesor Leopoldo Silva Bijit

26-05-2008

12
A 2 B 1

Estructuras de Datos y Algoritmos


B 0 A

C 1

C 1

h h h h-1
h h

h-1 h

Figura 11.17 Generalizacin de caso d). Doble rotacin. Del anlisis anterior, el algoritmo de insercin, debe implementar la rotacin simple a la derecha y la rotacin simple a la izquierda. Observando las correcciones despus de las rotaciones, se concluye que no es necesario seguir revisando los factores de balance de los nodos superiores a la raz del subrbol que originalmente produjo la necesidad de balancear (el que lleg a +2 -2), ya que ste queda con factor de balance 0. El alto de ese nodo es (h+1), antes y despus de la insercin y las correcciones.

11.3. Anlisis del descarte de un nodo.


Se descarta en forma similar a un rbol binario. Sin embargo, debido a la propiedad AVL, si el nodo a descartar tiene un solo subrbol (derecho o izquierdo), ese subrbol debe ser una hoja. Si tiene dos subrboles, de acuerdo al factor de balance se descarta el nodo que mejore el balance. Luego del descarte, debe ascenderse para mantener los factores de balance de la trayectoria hacia la raz, se pueden presentar varios casos. Debido a la simetra slo se analizan casos de descarte por la izquierda, la solucin para descartes por la derecha, se obtiene mediante imgenes especulares. 11.3.1. Detencin de la revisin de los factores de balance en el descarte. a) Al descartar por la izquierda, y en el proceso de ascenso de revisin de los factores de balance, si se llega a un nodo con factor cero, basta corregir el factor de ese nodo (quedando ste en +1) y no es preciso seguir el ascenso. Esto debido a que ese nodo no cambiar su altura; estaba en h y queda en h.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL


A 0
A 1

13

h-1

Figura 11.18 Descarte por izquierda. Se mantiene AVL. Caso a. 11.3.2. Continuar revisando factores de balance en el descarte. b) Al descartar por la izquierda, y en el proceso de revisin de los factores de balance, si se llega a un nodo con factor menos uno, se debe corregir el factor de ese nodo (quedando ste en cero) y es preciso seguir revisando en la va de ascenso. Esto debido a que ese nodo cambi su altura de (h+1) a h.
A -1
A 0

h+1

Figura 11.19 Descarte por izquierda. Se mantiene AVL. Caso b. 11.3.3. Rotacin simple para corregir desbalance en descarte. Detener revisin. c) En la situacin de la figura a la izquierda, se descarta por la izquierda. La figura central muestra la situacin, y la necesidad de rebalancear por prdida de propiedad AVL. Lo cual se logra con una rotacin a la izquierda, que se muestra en la Figura 11.20 de la derecha, generando un rbol AVL. No es preciso seguir la revisin ascendente, ya que el subrbol, no cambia su altura.

Profesor Leopoldo Silva Bijit

26-05-2008

14
A 1 B 0 h-1 h h h h A 2 B 0 cero

Estructuras de Datos y Algoritmos


B -1 A 1

h-1

h h

Figura 11.20 Descarte por rama izquierda. Deja de ser AVL. Caso c. 11.3.4. Rotacin doble para corregir el desbalance en descarte. d) En la situacin de la figura 11.21 a la izquierda, se descarta por la izquierda. La figura central muestra la situacin, y la necesidad de rebalancear por prdida de propiedad AVL. Lo cual se logra con una doble rotacin (primero a la derecha, luego a la izquierda). Es preciso seguir la revisin ascendente, ya que el subrbol, cambia su altura de (h+1) a h.
A 1 C -1 B 0 B 0
h-1 h-1 h-1 h-2 h-1

A 2 C -1 negativo
A 0

B 0 C 0

h h-1

h-1 h-2

h-1

h-1 h-1

h-1 h-2

h-1

Figura 11.21 Descarte por rama izquierda. Deja de ser AVL. Caso d. 11.3.5. Rotacin simple para corregir desbalance en descarte. Continuar revisin. e) En la situacin de la figura a la izquierda, se descarta por la izquierda. La figura central muestra la situacin, y la necesidad de rebalancear por prdida de propiedad AVL. Lo cual se logra con una rotacin a la izquierda. Es preciso seguir la revisin ascendente, ya que el subrbol cambia su altura, de (h+1) antes del descarte a h.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL


A 1 B 1 A positivo 2 B 1

15
B 0 A 0 h h-1

h h-1 h

h-1 h-1 h

h-1

Figura 11.22 Descarte por izquierda. Deja de ser AVL. Caso e. Las figuras centrales de 11.21 y 11.22 muestran que se puede discernir entre los casos d y e, observando el hijo derecho del nodo que pas a tener factor de balance dos. Esto implica que la funcin descartar debe analizar 10 casos. Cinco en descartes por la izquierda y 5 por la derecha. Se analizan en detalle rotaciones simples, que se deben emplear para mantener la propiedad de rbol AVL, en aquellos casos que lo requieren.

11.4. Rotacin simple a la izquierda.


Al inicio t apunta a la raz del subrbol. Luego de temp = t y t = t->right, queda la figura de la izquierda. Luego de temp->right = t->left; y t->left = temp queda la figura de la derecha.
temp A 2 B a b h h h+1 h h h+1 1 c a b t temp A 0 c B 0 t

Figura 11.23 Rotacin simple a la izquierda. En caso de un rbol AVL, la correccin de los factores de balance se puede efectuar segn: temp->bal =0 y t->bal =0. Sin embargo para lograr una rutina general de rotacin se analiza la siguiente situacin:

Profesor Leopoldo Silva Bijit

26-05-2008

16
temp A x B y a b c a t temp

Estructuras de Datos y Algoritmos


B nB A nA t

Figura 11.24 Anlisis de los factores de balance. Sean a, b y c los altos de los subrboles, que no cambian. Antes de la rotacin, los factores de balance de los nodos A y B son x e y, respectivamente; luego de la rotacin stos se denominan: nA y nB, segn se muestra en la Figura 11.24. En la figura de la izquierda se cumplen: y = c-b, x=b+1-a si b>c, o x=c+1-a si c>b En la figura de la derecha se cumplen, por la definicin del factor de balance: nA= b-a, nB= c-1-a si a>b, o nB=c-1-b si b>a. Se desea determinar nA y nB en trminos de x e y. Clculo de nA: Reemplazando (b-a) por (x-1) para b>c, y por (c-a)-(c-b) para c>b, se obtienen: nA=x-1-0 con b>c o bien: nA=x-1-y para c>b Las ltimas dos ecuaciones pueden anotarse: nA=x-1-max(y,0) Lo cual puede comprobarse, ya que si y es negativo (para b>c), queda nA=x-1; y si y es positivo (para c>b), queda nA=x-1-y. Clculo de nB: Para a>b, se tiene reemplazando (c-a) por (b-a)+(c-b) si b>c se obtiene: nB=(c-a)-1=(x-1)+y-1 es decir: nB=x-2+y Para a>b, se tiene reemplazando (c-a) por (x-1) si c>b se obtiene nB=(c-a)-1=x-2+0. Las dos relaciones anteriores pueden anotarse, en forma compacta: nB=x-2+min(y, 0) Profesor Leopoldo Silva Bijit 26-05-2008

rboles balanceados AVL

17

Lo cual puede comprobarse, ya que si y es negativo (para b>c) se tiene que min(y,0) es y; si y>0, se tiene que min(y,0) es cero. Para b>a, se tiene nB= y-1 Observando la siguiente relacin, que puede deducirse de la Figura 11.24 derecha: nB = c-(max(a,b)+1) Entonces nB debe ser la menor de las diferencias posibles: nB = min(c-a-1, c-b-1) Reemplazando (c-a-1) por nB y (c-b-1) por (y-1), se tiene: nB = min(nB, y-1) Finalmente, reemplazando nB, en la expresin en la derecha por x-2+min(y, 0), calculada antes, se obtiene: nB = min(x-2+min(y,0), y-1) El siguiente segmento corrige factores de balance en una rotacin simple a la izquierda: x = temp->bal; // oldbal(A) y = t->bal; // oldbal(B) temp->bal = x-1-max(y, 0); // newbal(A) t->bal = min(x-2+min(y, 0), y-1); // newbal(B) Los siguientes macros implementan las funciones mnimo y mximo # define max(A,B) ((A)>(B)?(A):(B)) /* Definicin de macro */ # define min(A,B) ((A)>(B)?(B):(A)) Ntese los argumentos de los macros entre parntesis. La rotacin simple a la derecha es la imagen especular del caso recin analizado.

11.5 Operaciones.
11.5.1. Definicin de tipos. typedef struct avlnode { int clave; int bal; /* Factor de balance -1,0,1 */ struct avlnode *left, *right; } nodo, *pnodo;

Profesor Leopoldo Silva Bijit

26-05-2008

18 11.5.2. Definicin variables globales: Flag, key, alto_avl.

Estructuras de Datos y Algoritmos

int flag; /* Marca para registrar cambios de altura. En rebalance ascendente */ //flag = 1 indica que debe seguir el ascenso rebalanceando. int key; /* Variable global, para disminuir argumentos */ int alto_avl = 0; /* Altura rbol avl. Nmero de nodos desde la raz a las hojas.*/ 11.5.3. Inserta nodo en sub-rbol apuntado por t. /* Mantiene variable global con el alto del rbol. */ pnodo InsertarAVL(int clave, pnodo t) { key = clave; //pasa argumento a global. t = insertR(t); if (flag == 1) alto_avl++; //si la propagacin llega hasta la raz, aumenta la altura. return t; } tree insertR(tree t) { if (t == NULL){ /* Lleg a un punto de insercin */ t = CreaNodo(key); /* Crea nuevo nodo */ t->bal = 0; /* Los dos hijos son nulos */ flag = 1; /* Marca necesidad de revisar balances */ return t; /* retorna puntero al insertado */ } else if (t->clave < key){ //desciende por la derecha t->right = insertR(t->right); //se pasa por la siguiente lnea en la revisin ascendente t->bal += flag; /* Incrementa factor de balance */ } else if (t->clave > key){ //desciende por la izquierda t->left = insertR(t->left); //se corrige en el ascenso t->bal -= flag; /* Decrementa balance */ } else { /* (t->k == key) Ya estaba en el rbol */ Error(1); flag = 0; } if (flag == 0) /* No hay que rebalancear. Sigue el ascenso */ return t;

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL /*El cdigo a continuacin es el costo adicional para mantener propiedad AVL */ /* Mantiene rbol balanceado avl. Slo una o dos rotaciones por insercin */ if(t->bal < -1) { /* Qued desbalanceado por la izquierda. Espejos casos c y d.*/ if(t->left->bal > 0) /* Si hijo izquierdo est cargado a la derecha */ t->left = lrot(t->left); t = rrot(t); flag = 0; /* El subrbol no aumenta su altura */ } else if(t->bal > 1) { /* Si qued desbalanceado por la derecha. Casos c y d.*/ if(t->right->bal < 0) /* Si hijo derecho est cargado a la izquierda Caso d. Fig. 11.16*/ t->right = rrot(t->right); t = lrot(t); /*caso c.*/ flag = 0; /* El subrbol no aumenta su altura */ } else if(t->bal == 0)/* La insercin lo balanceo */ flag = 0; /* El subrbol no aumenta su altura. Caso a. Fig. 11.8*/ else /* Qued desbalanceado con -1 +1 Caso b. Fig. 11.9 */ flag = 1; /* Propaga ascendentemente la necesidad de rebalancear */ return t; }

19

11.5.4. Descarta nodo en sub-rbol apuntado por t. pnodo DescartarAVL(int clave, pnodo t) { key = clave; t = deleteR(t); if (flag == 1) alto_avl--; return t; } pnodo deleteR(pnodo t) { pnodo p; if(t == NULL) { /* No encontr nodo a descartar */ Error(0); flag = 0; } else if(t->clave < key) { //Comienza el descenso por la derecha t->right = deleteR(t->right); //aqu se llega en el retorno ascendente. t->bal -= flag; /* Se descart por la derecha. Disminuye factor */ Profesor Leopoldo Silva Bijit 26-05-2008

20

Estructuras de Datos y Algoritmos //Se retorna despus de la revisin de los factores } else if (t->clave > key) { //Desciende por la izquierda t->left = deleteR(t->left); //o se llega por esta va si se descart por la izquierda. t->bal += flag; /* se descart por la izq. Aumenta factor de balance */ } else { /* (t->clave == key) */ /* Encontr el nodo a descartar */ if (t->left == NULL) { /*Si hay hijo derecho debe ser hoja, por ser AVL */ p = t; t = t->right; free(p); flag = 1; /* Debe seguir revisando factores de balance */ return t; /* ascendentemente */ } else if (t->right == NULL) { /*Si hay hijo izquierdo debe ser hoja */ p = t; t = t->left; free(p); flag = 1; /* Asciende revisando factores de balance */ return t; /* Corrigiendo */ } else { /* Tiene dos hijos */ if(t->bal<0) { /* Si cargado a la izquierda, elimina mayor descendiente hijo izq */ p = t->left; while (p->right != NULL) p = p->right; t->clave = p->clave; key = p->clave; //busca hoja a eliminar t->left = deleteR(t->left); t->bal += flag; /* incrementa factor de balance */ } else { /* Si cargado a la derecha, elimina menor descendiente hijo der */ p = t->right; while (p->left != NULL) p = p->left; t->clave = p->clave; key = p->clave; t->right = deleteR(t->right); t->bal -= flag; /* decrementa balance */ } } } /* Mantiene rbol balanceado avl. Slo una o dos rotaciones por descarte */ if (flag == 0 ) /* No hay que rebalancear. Sigue el ascenso, sin rebalancear */ return t;

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL /* Hay que revisar factores de balance en el ascenso*/ if(t->bal < -1) { /* Si qued desbalanceado por la izquierda y dej de ser AVL */ if(t->left->bal > 0) { /*espejos casos c, d y e */ /* Si el hijo izquierdo est cargado a la derecha */ t->left = lrot(t->left); flag = 1; /*Continuar revisando factores */ } else if (t->left->bal == 0) flag = 0; /*No debe seguir el rebalance */ else flag = 1;/* Debe seguir revisando factores de balance */ t = rrot(t); } else if(t->bal > 1) { /* Si qued desbalaceado por la derecha */ if(t->right->bal < 0) { /* Si hijo derecho est cargado a la izquierda */ t->right = rrot(t->right); flag = 1; //debe seguir revisando. Caso d. } else if (t->right->bal == 0) flag = 0; /* No debe seguir el rebalance. Caso c. */ else //positivo flag = 1;/* Debe seguir revisando factores de balance. Caso e. */ t = lrot(t); } else if (t->bal == 0) /* Si estaba en +1 -1 y queda en cero */ flag = 1; /* Debe seguir corrigiendo. Caso b.*/ else /* Si estaba en cero y queda en -1 +1 */ flag = 0; /* No debe seguir rebalanceando. Caso a.*/ return t; } 11.5.5. Rotaciones. /* Rotacin Izquierda * * A B * / \ / \ * a B ==> A c * / \ / \ * b c a b * Slo cambian los factores de balance de los nodos A y B * Los factores de balance de los sub-rboles no cambian. */

21

Profesor Leopoldo Silva Bijit

26-05-2008

22 static pnodo lrot(pnodo t) { pnodo temp; int x,y; temp = t; t = t->right; temp->right = t->left; t->left = temp; //Recalcula factores de balance de los dos nodos x = temp->bal; // oldbal(A) y = t->bal; // oldbal(B) temp->bal = x-1-max(y, 0); t->bal = min(x-2+min(y, 0), y-1); return t; }

Estructuras de Datos y Algoritmos

/* Rotacin derecha * * A * / \ * B c * / \ * a b * */ static pnodo rrot(pnodo t) { tree temp = t; int x,y;

==>

B / \ a A / \ b c

t = t->left; temp->left = t->right; t->right = temp; x = temp->bal; y = t->bal; /* x=c-1-a x=c-1-b. y = b-a * nA = c-b. nB =c+1-a nB=b+1-a * nA= x+1-y o nA=x+1-0 * nA = x+1-min(y,0) * nB = max(b,c)+1-a => max(b-a+1,c-a+1) * => max(y+1,x+2+max(y,0)) */ temp->bal = x+1-min(y, 0); t->bal = max(x+2+max(y, 0), y+1); return t; }

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL 11.5.6. Otras funciones. static void Error(int tipo) { if (tipo) printf("\nError en insercin\n"); else printf("\nError en descarte\n"); } int Altura(void) { return alto_avl; } pnodo deltree(pnodo t) //borra el rbol completo { alto_avl = 0; return deltreeR(t); } pnodo deltreeR(pnodo t) { if (t != NULL) { t->left = deltreeR(t->left); t->right = deltreeR(t->right); free(t); //borra la raz subrbol } return NULL; } void inorder(pnodo t, int profundidad) { if (t != NULL) { inorder(t->left, profundidad+1); printf ("v= %d p=%d bal=%d \n", t->clave, profundidad, t->bal); inorder(t->right, profundidad+1); } }

23

Profesor Leopoldo Silva Bijit

26-05-2008

24

Estructuras de Datos y Algoritmos

Problemas resueltos.
P11.1. Para el siguiente rbol AVL
7

3 4

Figura P11.1. a) Indique los factores de balance de cada nodo. b) Dibujar el rbol AVL, despus de la insercin de un nodo con valor 2. Qu operaciones se efectan?. c) Habiendo ya insertado el nodo con valor 2, dibujar el rbol AVL, despus de la insercin de un nodo con valor 6. Qu operaciones se efectan?. Solucin. a) Los factores de balance:
-1 7

0 0

3 4

0 0

Figura P11.2. b) Luego de insertar el 2, no queda AVL. Con una rotacin simple a la derecha, se reestablece la propiedad AVL.
+1 3 -1 7

-2

7 -1

+1 1

3 +1 2 4 0

8 0

+1 1 0 2 0

+1 4 6

Figura P11.3.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL c) La insercin del 6, no requiere rotaciones para mantener la propiedad AVL.

25

Ejercicios propuestos.
E11.1 Dado el siguiente rbol AVL:
8

12

7 3
5

14

11

13

15

1
Figura E11.1. a) Determinar el rbol y el factor de balance de cada nodo despus de Insertar nodos con valores 6 y 10. Especificar las operaciones elementales para mantener el balance, indicando cmo queda el rbol. b) Determinar el rbol y el factor de balance de cada nodo despus de Descartar nodos con valores 13, 14, 15, 9 y 11. Especificar las operaciones elementales para mantener el balance, indicando cmo queda el rbol. Nota: en a) y b) se parte del rbol dado. Son situaciones independientes.

Referencias.
Niklaus Wirth, Algorithms + Data Structures = Programs, Prentice-Hall 1975. G.M. Adel'son-Vel'skii and E.M. Landis. An algorithm for the organization of information. Soviet Mathematics Monthly, Volume 3, pp.1259-1263, 1962.

Profesor Leopoldo Silva Bijit

26-05-2008

26

Estructuras de Datos y Algoritmos

ndice general.
CAPTULO 11 ............................................................................................................................................1 RBOLES BINARIOS BALANCEADOS DE BSQUEDA. AVL. ......................................................1 11.1 ANLISIS DE COMPLEJIDAD. ..............................................................................................................1 11.2. ANLISIS DE LA INSERCIN. .............................................................................................................6 11.2.1. Detencin de revisin en ascenso. ...........................................................................................7 11.2.2. Continuar revisando factores de balance en ascenso. .............................................................7 11.2.3. Casos que producen desbalances. ............................................................................................8
11.2.3.1. Insercin externa por la derecha. ....................................................................................................... 8 11.2.3.2. Insercin interna por la derecha. ....................................................................................................... 9

11.3.4. Rotaciones para mantener propiedad AVL. .............................................................................9


11.3.4.1. Correccin con rotacin simple en insercin................................................................................... 10 11.3.4.2. Correccin con rotacin doble en insercin. ................................................................................... 11

11.3. ANLISIS DEL DESCARTE DE UN NODO. ..........................................................................................12 11.3.1. Detencin de la revisin de los factores de balance en el descarte. ......................................12 11.3.2. Continuar revisando factores de balance en el descarte. ......................................................13 11.3.3. Rotacin simple para corregir desbalance en descarte. Detener revisin.............................13 11.3.4. Rotacin doble para corregir el desbalance en descarte. ......................................................14 11.3.5. Rotacin simple para corregir desbalance en descarte. Continuar revisin. ........................14 11.4. ROTACIN SIMPLE A LA IZQUIERDA. ...............................................................................................15 11.5 OPERACIONES. ................................................................................................................................17 11.5.1. Definicin de tipos. ................................................................................................................17 11.5.2. Definicin variables globales: Flag, key, alto_avl. ..............................................................18 11.5.3. Inserta nodo en sub-rbol apuntado por t. ............................................................................18 11.5.4. Descarta nodo en sub-rbol apuntado por t. .........................................................................19 11.5.5. Rotaciones. .............................................................................................................................21 11.5.6. Otras funciones. .....................................................................................................................23 PROBLEMAS RESUELTOS. ........................................................................................................................24 P11.1. Para el siguiente rbol AVL ...................................................................................................24 EJERCICIOS PROPUESTOS. ........................................................................................................................25 E11.1 Dado el siguiente rbol AVL: ..................................................................................................25 REFERENCIAS. .........................................................................................................................................25 NDICE GENERAL. ....................................................................................................................................26 NDICE DE FIGURAS. ................................................................................................................................27

Profesor Leopoldo Silva Bijit

26-05-2008

rboles balanceados AVL

27

ndice de figuras.
Figura 11.1 rboles Fibonacci AVL, con alturas 0, 1................................................................... 2 Figura 11.1.a. rboles Fibonacci AVL, con altura 2. ................................................................... 2 Figura 11.2 Ejemplo rbol AVL Fibonacci, con altura 3. ............................................................. 2 Figura 11.3 rbol AVL Fibonacci, con altura 4. .......................................................................... 3 Figura 11.4 Cota AVL en funcin de n. ........................................................................................ 4 Figura 11.5 Complejidad de la altura de un rbol AVL. ............................................................... 5 Figura 11.6 Alargue de altura rbol AVL, respecto de perfectamente balanceado ....................... 5 Figura 11.6.a. Razn urea . ........................................................................................................ 6 Figura 11.7 Inserciones que slo requieren recalcular factor de balance. ..................................... 7 Figura 11.8 Detencin de revisin en ascenso. Caso a.................................................................. 7 Figura 11.9 Continuar revisin en ascenso. Caso b....................................................................... 8 Figura 11.10 rbol AVL, para analizar prdida de propiedad AVL. ............................................ 8 Figura 11.11 rbol no AVL, despus de insercin externa por la derecha. .................................. 9 Figura 11.12 rbol no AVL, despus de insercin interna por la derecha. .................................. 9 Figura 11.13 rbol AVL de Figura 11.11, despus de rotacin simple a la izquierda. .............. 10 Figura 11.14 rbol AVL de la figura 11.12, despus de doble rotacin. .................................... 10 Figura 11.15 Generalizacin de caso c). Rotacin simple. ......................................................... 11 Figura 11.16 Generalizacin de caso d). ..................................................................................... 11 Figura 11.17 Generalizacin de caso d). Doble rotacin. ........................................................... 12 Figura 11.18 Descarte por izquierda. Se mantiene AVL. Caso a. ............................................... 13 Figura 11.19 Descarte por izquierda. Se mantiene AVL. Caso b. ............................................... 13 Figura 11.20 Descarte por rama izquierda. Deja de ser AVL. Caso c......................................... 14 Figura 11.21 Descarte por rama izquierda. Deja de ser AVL. Caso d. ....................................... 14 Figura 11.22 Descarte por izquierda. Deja de ser AVL. Caso e.................................................. 15 Figura 11.23 Rotacin simple a la izquierda. .............................................................................. 15 Figura 11.24 Anlisis de los factores de balance. ....................................................................... 16 Figura P11.1. ............................................................................................................................... 24 Figura P11.2. ............................................................................................................................... 24 Figura P11.3. ............................................................................................................................... 24 Figura E11.1. ............................................................................................................................... 25

Profesor Leopoldo Silva Bijit

26-05-2008