Documente Academic
Documente Profesional
Documente Cultură
BALANCEADOS
Estructuras de Datos
CCPG1006
EFICIENCIA DE LOS ABB
35
El árbol queda alineado todo hacia la derecha
18
El árbol debe guardar otra estructura.
27
Este tipo de árboles fueron descritos en 1962 por los matemáticos rusos G. M.
Adelson-Velskii y E. M. Landis. (AVL)
equilibrado F.E. 7 10
6 10 debe ser –1, 0 o 1
-1 0
0
0
6 ARBOL NO EQUILIBRADO
0
REESTRUCTURACION
Al insertar una nueva clave pueden darse algunos casos, que dependerán de
las alturas de los subarboles(izq y der)
Tipos de Casos:
– Altura no es afectada, todo OK
– Altura es afectada y algún fe se daña, hay que decidir que tipo de
reestructuración es:
ROTACION IZQUIERDA IZQUIERDA(II)
ROTACION DERECHA DERECHA(DD)
ROTACION IZQUIERDA DERECHA(ID)
ROTACION DERECHA IZQUIERDA(DI)
CASO I: TODO OK
10
01
0 0 0 1 0
0
INSERCION: CASOS POSIBLES
Inserción en :
ROTACION IZQUIERDA IZQUIERDA(II) el subárbol izquierdo de la rama izquierda.
ROTACION DERECHA DERECHA(DD) el subárbol derecho de la rama derecha.
ROTACION IZQUIERDA DERECHA(ID) el subárbol derecho de la rama izquierda.
ROTACION DERECHA IZQUIERDA(DI) el subárbol izquierdo de la rama derecha.
Los f.e. de
n y n1,
n quedaron 0
18
n1
12 -1
-2 25
¿y el
0 17? 12
-1
0
9 17
9 0 18
0-1 0 Al rotar, el 18
1 debe bajar, no 0
1
-1 17 25
0 importa el 17
0 0 0
n.izq = n1.der
n1.der = n
n = n1
ROTACION II: IMPLEMENTACION
n
void RotacionII(NodoAVL<E> n){ 18
n1
-2
NodoAVL<E> n1= n.izq; 12 25
0
n.izq = n1.der; 9
-1
17
n1.der = n; -1
0
1
n = n1;
0
n.fe = n1.fe = 0;
12
} 0 18
9
0
1
-1
17 25
0 0 0
ROTACION SIMPLE DD
Los f.e. de
n
Si se detecta un f.e. 2, el cambio n y n1,
viene por la derecha (positivo) quedaron 0
18
21 n1 Si el siguiente nodo también tiene
un f.e. 1, hay que rotar DD
10 25
25
30 0
18 30
0
Al rotar 0 0
n. der = n1. izq
ALERTA, F.E. FUERA DE n1. izq = n
RANGO !!! n = n1
ROTACION DD: IMPLEMENTACION
n
n 18
18 Si el f.e. de
n1 Si el f.e. de n2 n1
n2 es -1, al es 1, al rotar : 12 -2
-1 25
12 -1
-2 25 rotar: 0
n1.fe= -1 n2
n.fe = 1, n.fe = 10
10 0 9 16
9 17 n2 n1.fe = n2.fe n2.fe = 0
=0 0 10
0
15
0
-1 17
0
0
f.e. 1
17 16
ROTAR 0 18 0 18
ID 12 12
1 0
0 25 -1
17 25
9 15 9
0 0 0
0 0 0
ROTACION ID: IMPLEMENTACION
void RotacionID(NodoAVL<E> n){
n
NodoAVL <E> n1=n.izq, n2=n1.der; n
18 18
n1.der =n2.izq; n1 -2
n.izq = n2.der; 12 25 0
n1 -2
-1 25
12
n2.der = n; 1 n2 0
9 17 10 n2
n2.izq = n1; 9 16
0 -1
n1.fe = n.fe = 0; 0
15 10
17
if(n2.fe==-1)
0 0
n.fe = 1;
if(n2.fe==1)
n1.fe = -1;
n2.fe = 0;
n = n2; 17 16
} 18
12 0 18 12 0
0
0
1
25 -1
17 25
9 15 9
0 0 0
0 0
0
ROTACION DOBLE DI
21
n Si se detecta un f.e. 2, el cambio
viene por la derecha
18
Si el siguiente nodo tiene un f.e.
-1
0 n1 negativo, hay que rotar DI
n2 25
20
0
0
AL ROTAR
20
0 0
18 25
ROTACION DI: IMPLEMENTACION
Si n.fe == 2
Si n1.fe == 1, ROTACION DD
Si no ROTACION DI
Si n.fe == -2
Si n1.fe ==-1, ROTACION II
Si no ROTACION ID
EJERCICIO
Crear un AVL insertando las siguientes claves:
100, 29, 71, 82, 48, 39, 101, 22, 46, 17, 3, 20, 25, 10
INSERTAR: IMPLEMENTACION
Si n.fe = 2
Si n1.fe >= 0, ROTACION DD
Si no ROTACION DI
Si n.fe = -2
Si n1.fe <= 0, ROTACION II
Si no ROTACION ID
CASOS
El FE de n1 es 0,
altura no disminuye,
el FE de n queda -1
El FE de n1 es -1, y el FE de n1 queda
Al yaltura
rotar, disminuye,
la altura del árbol puede
todos los FE de
disminuir 1
los participantes
Tomemos como ejemplo la rotación II
quedan 0
II 18 II
18
3 -1
-2 25
3 12
12
-2
-1 25
0
0
-1
0 9 17
9 12
0 0
0
3 9 1 18
12
2 -1
9 0 18 No 0 17
Disminuye Disminuye
0 0
0
OTRO CASO
18 17
Disminuye 2
-2
-1 25 12 0 18
3 12
0 0
1 0
17
0
CONCLUSION AL ELIMINAR
En las rotaciones DI y ID
La altura siempre disminuye
f.e. = 0
ROTACION II:IMPLEMENTACION
}
ELIMINACION: ALGORITMO
• Si el árbol esta vacio, la clave buscada no esta en el árbol
• Si no, Busco
• Si clave buscada es menor que la clave evaluada
– Eliminar por el lado izquierdo
– Si la altura del árbol cambia
• Actualizar factores izquierda
• Si clave buscada es mayor que la clave evaluada
– Eliminar por el lado derecho
– Si altura del árbol cambia
• Actualizar factores derecha
• Si clave evaluada es igual a clave buscada: Eliminar nodo
– Si el nodo solo tiene un hijo : Redireccionar y Liberar, ALTURA
CAMBIA
– Si no,
• Bajar por el arbol, para buscar el menor de los mayores, intercambiar
• Eliminar ahora la clave izq de más a la derecha
• Subir por el mismo camino, actualizar factores
RECALCULANDO FACTORES
• Eliminación por el lado derecho, decrementa en 1 al fe
– Si era 0, ahora es –1, y su altura no cambia
– Si era 1, ahora es 0, altura cambia
– Si era –1, ahora es –2, ROTAR!!
• Dos posibles rotaciones II o ID
• Esto depende del siguiente derecho, si es <= 0 II, si no ID
• Si se escoge II y n1.fe == -1, altura no cambia
• Si es ID, altura cambia
• Eliminación por el lado izquierdo, aumenta en 1 al fe
– Si era 0, ahora es 1, y su altura no cambia
– Si era -1, ahora es 0, y su altura cambia
– Si era 1, ahora es 2, ROTAR!!
• Dos posibles rotaciones DI o DD
• Esto depende del siguiente derecho, si es >= 0: DD, si es negativo DI
• Si se escoge DD y n1.fe == 1, altura no cambia
• Si es DI, altura cambia
ELIMINAR: IMPLEMENTACION