Árboles avl m.c. meliza contreras gonzález. 2 ¿qué es un árbol avl? es un árbol binario de...
TRANSCRIPT
Árboles AVL
M.C. Meliza Contreras González
2
¿Qué es un árbol AVL?
• Es un árbol binario de búsqueda al que se le añade una condición de equilibrio.
• Esta condición es que para todo nodo la altura de sus subárboles izquierdo y derecho pueden diferir a lo sumo en una unidad.
• Propuesto en 1962 por Adelson-Velskii y Landis.
3
Ejemplos de árboles AVL
no
no
4
Factor de balanceo
• Los nodos de un árbol AVL guardan un valor entre 1 y -1, lo que se conoce como Factor de Balanceo(FB) y representa la diferencia entre las alturas de sus subárboles.
0 las alturas son iguales• FB= 1 altura del derecho> izquierdo -1 altura del izquierdo> derecho
5
Factor de balanceo de árboles AVL
0 -
0
0
0 0
- +
-
0
0 0
0
+
0
+
6
Inserción de un nodo en un árbol AVL
• La inserción es idéntica que en un árbol binario de búsqueda.
• Una vez realizada la inserción si el árbol se desbalancea se realizan:– Determinación del nodo pivote: nodo con FB
distinto de 0 más cercano a los ancestros del nodo insertado
– Rotaciones simples– Rotaciones dobles
7
Casos de balanceo después de la inserción
1. El árbol AVL carece de nodo pivote: significa que en todos los ancestros del nuevo nodo tienen FB=0, al insertar el nodo, el árbol no se desbalancea, sólo se ajustan los valores de FB de todos los ancestros.
0
0 0
0 0 0 0
Nuevo nodo
0 -
0
+
0 + 0
Nuevo nodo
8
Casos de balanceo después de la inserción
2. El árbol AVL tiene nodo pivote y el nuevo nodo se inserto en el subárbol más pequeño del pivote: en este caso se igualan las alturas de los dos subárboles y no ocurre desbalanceo, sólo se ajustan los valores de FB de todos los ancestros.
+
Nuevo nodo
0 -
0 0 + 0
0
Nodo pivote0 0
0 0 + +
0
Nodo pivote
9
Casos de balanceo después de la inserción
3. El árbol AVL tiene nodo pivote y el nuevo nodo se inserto en el subárbol más grande del pivote: en este caso se desbalancea el árbol a partir del pivote y hay que ocupar rotaciones.
10
Rotación simple izquierda
Resto del árbol
A
3
B
1 2
0
Nuevo nodo
0
Resto del árbol
B
1
A
2 3
pivote
Nuevo nodo
0
+
Los triángulos pueden ser nulos
11
Rotación simple derecha
Nuevo nodo
Resto del árbol
A
3
B
2 1
00
Nuevo nodo
Resto del árbol
B
1
A
3 2
pivote
0
-
Los triángulos pueden ser nulos
12
Rotación doble izquierda
Nuevo nodo
Nuevo nodo
Resto del árbol
B
1
A
24
pivote0
+
C
3
0
Resto del árbol
C
B
1 4
00,-
A
0,+
2 3
Los triángulos pueden ser nulos.
El nodo C puede ser el nodo a insertar
13
Rotación doble derecha
Resto del árbol
C
A
4 1
0
Nuevo nodo
0,-
Resto del árbol
B
1
A
34
pivote
Nuevo nodo
0
-
C
2
0B
0,+
3 2
Los triángulos pueden ser nulos.
El nodo C puede ser el nodo a insertar
14
Ejemplos
1. Antes de insertar hay que checar que sea un árbol AVL
2. Identificar los casos dependiendo si tiene pivote o no y en que subárbol se va a insertar.
3. Si se desbalancea hay que revisar que rotaciones aplicar
Insertar el nodo 5
Caso 2: tiene pivote (nodo 4) y se inserta en el subárbol más pequeño y se actualizan los factores de balanceo de los ancestros
12
7 21
4 9 16 25
2 8 13 19
0
0
00
0000
-
- -pivote
12
7 21
4 9 16 25
2 8 13 195
0
-
- 00
0000 0
0
0
15
Insertar el nodo 26
Caso 2: tiene pivote (nodo 21) y se inserta en el subárbol más pequeño, en este caso no hay subárboles cuyo nodo padre sea 25 y se actualizan los factores de balanceo de los ancestros
12
7 21
4 9 16 25
2 8 13 19
0
0
00
0000
-
- -
pivote 12
7 21
4 9 16 25
2 8 13 19
0
0
+0
0000
0
- -
260
16
Insertar el nodo 23
Caso 2: tiene pivote (nodo 25) y se inserta en el subárbol más pequeño y se actualizan los factores de balanceo de los ancestros
12
7 21
4 9 16 25
2 8 13 19
0
0
+0
0000
0
- -
260
pivote
0
12
7 21
4 9 16 25
2 8 13 19
0
0
00
000
0
- -
260
230
17
Insertar el nodo 27
Caso 1: no tiene pivote y se inserta como hijo derecho del nodo padre que es 26, se actualizan los factores de balanceo de los ancestros
0
12
7 21
4 9 16 25
2 8 13 19
0
0
00
0000
0
- -
26230
12
7 21
4 9 16 25
2 8 13 19
+
0
+0
0000
+
- -
26+
230
270
18
Insertar el nodo 28(rotación simple izquierda)
Caso 3: tiene pivote (nodo 26) y se desbalancea el árbol a partir del mismo, por lo que se requiere una rotación (izquierda porque el pivote es +) .
12
7 21
4 9 16 25
2 8 13 19
+
0
+0
0000
+
- -
26+
230
27
0
pivote
+
0
12
7 21
4 9 16 25
2 8 13 19
0
+0
000
+
- -
26+
230
270
28
pivote
En este caso los triángulos 1,2,3 son nulos.
1
0
12
7 21
4 9 16 25
2 8 13 19
0
+0
000
+
- -
26+
230
270
28
B
A
2 3
+
1
0
12
7 21
4 9 16 25
2 8 13 19
0
+0
000
+
- -
270
230
260
28
A
B2
3
+
0
El nodo 28 es el hijo derecho del nodo 27 dado que el triángulo 3 es nulo, es decir el nodo A en la rotación se vuelve el nodo padre de B y del nodo a insertar ver rotación simple izquierda
19
Insertar el nodo 0(rotación simple derecha)
Caso 3: tiene pivote (nodo 4) y se desbalancea el árbol a partir del mismo, por lo que se requiere una rotación (derecha porque el pivote es -) .
12
7 21
4 9 16 25
2 8 13 19
0
0
00
0000
-
- -pivote
En este caso los triángulos 1,2,3 son nulos.
El nodo 0 es el hijo izquierdo del nodo 2 dado que el triángulo 3 es nulo, es decir el nodo A en la rotación se vuelve el nodo padre de B y del nodo a insertar ver rotación simple derecha
12
7 21
4 9 16 25
2 8 13 19
0
0
00
0000
-
- -
0
pivote
1
12
7 21
4 9 16 25
2 8 13 19
0
0
00
0000
-
- -
0
B
A
3 2
0
1
12
7 21
2 9 16 25
4 8 13 19
0
0
00
000
-
0-
0
A
B3
2
0
20
Insertar el nodo 8(rotación doble derecha)
Caso 3: tiene pivote (nodo 10) y se desbalancea el árbol a partir del mismo, por lo que se requiere una rotación (derecha porque el pivote es -) .
pivote
50
30 70
15 40 55 80
10 42 52 60
-
-
++
00
0 0
+ -
90
0
-
58 66
00
0
35
+
37
0
-
20
-
18 25
-
17
0
7
0
50
30 70
15 40 55 80
10 42 52 60
-
-
++
00
0 0
+ -
90
-
58 66
00
0
35
+
37
0
-
20
-
18 25
-
17
0
7
8 17
pivote
21
Insertar el nodo 8 (segunda parte)(rotación doble derecha)
En este caso los triángulos 1,2,3,4 son nulos, y el nodo C es el nodo a insertar.
0
-
B
50
30 70
15 40 55 80
10 42 52 60
-
++
00
0 0
+ -
90
-
58 66
00
0
35
+
37
0
-
20
-
18 25
-
17
0
7
8 17
A1
4 C
3 2
El nodo C en la rotación doble es el padre de A y B, ver rotación doble derecha
C
50
30 70
15 40 55 80
8 42 52 60
-
++
00
0 0
+ -
90
-
58 66
00
0
35
+
37
0
0
20
-
18 25
-
17
0
7 10
17
A
14
B
3 2
-
0
0
22
Insertar el nodo 36(rotación doble izquierda)
Caso 3: tiene pivote (nodo 35) y se desbalancea el árbol a partir del mismo, por lo que se requiere una rotación (izquierda porque el pivote es +) .
pivote
50
30 70
15 40 55 80
10 42 52 60
-
-
++
00
0 0
+ -
90
0
-
58 66
00
0
35
+
37
0
-
20
-
18 25
-
17
0
7
0
50
30 70
15 40 55 80
10 42 52 60
-
-
++
00
0 0
+ -
90
-
58 66
00
0
35
+
37
0
-
20
-
18 25
-
17
0
7
3617
pivote
23
Insertar el nodo 36 (segunda parte)(rotación doble izquierda)
En este caso los triángulos 1,2,3,4 son nulos, y el nodo C es el nodo a insertar.
El nodo C en la rotación doble es el padre de A y B, ver rotación doble izquierda
-
0
71
32
50
30 70
15 40 55 80
10 42 52 60
-
++
00
0
+ -
90
-
58 66
00
0
35
+
37
0
-
20
-
18 25
-
17
0
36
B
A
4
C
-
0
7
1 32
50
30 70
15 40 55 80
10 42 52 60
-
++
00
0
+ -
90
-
58 66
00
0
36
0
37
0
-
20
-
18 25
-
17
0
35
C
A
4
B 0