Subido por Mta Contreras

Unidad5arbolesAVL

Anuncio
Árboles AVL
M.C. Meliza Contreras González
¿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.
2
Ejemplos de árboles AVL
no
no
3
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.
• FB=
0 las alturas son iguales
1 altura del derecho> izquierdo
-1 altura del izquierdo> derecho
4
Factor de balanceo de árboles
AVL
0
-
+
-
0
0
0
0
+
0
+
0
0
0
0
5
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
6
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
Nuevo nodo
0
0
0
0
+
0
Nuevo nodo
7
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.
+
Nodo pivote
-
0
0
0
+
0
0
Nodo pivote
0
0
0
0
+
+
0
Nuevo nodo
8
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.
9
Rotación simple izquierda
Resto del árbol
+
Resto del árbol
pivote
B
A
0
0
0
A
B
3
1
2
Los triángulos
pueden ser nulos
3
1
2
Nuevo nodo
Nuevo nodo
10
Rotación simple derecha
Resto del árbol
-
B
Resto del árbol
pivote
A
0
0
0
A
B
1
3
3
2
2
1
Nuevo nodo
Nuevo nodo
Los triángulos
pueden ser nulos
11
Rotación doble izquierda
Resto del árbol
Resto del árbol
+
B
C 0
pivote
0
A
0,-
0,+
A
B
0
C
1
2
2
3
1
4
Los triángulos
pueden ser nulos.
Nuevo nodo
3
El nodo C puede ser
el nodo a insertar
4
Nuevo nodo
12
Rotación doble derecha
Resto del árbol
Resto del árbol
-
B
C 0
pivote
0,-
0
A
0,+
B
A
0
C
1
4
3
2
3
4
1
Los triángulos
pueden ser nulos.
El nodo C puede ser
el nodo a insertar
Nuevo nodo
2
Nuevo nodo
13
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
0
0
12
0
-
7
pivote -
4
0
2
21
-
0
0
0
9
16
25
4
0
0
8
13
0
19
Insertar el nodo 5
12
0
0
2
7
21
-
0
9
0
5
0
8
-
25
16
0
13
0
0
19
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
14
Insertar el nodo 26
0
0
12
0
-
7
-
4
0
2
0
21
-
0
0
9
16
25
0
0
8
13
0
19
12
pivote
0
7
-
4
0
2
21
-
0
+
9
16
25
0
0
8
13
0
0
19
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
15
Insertar el nodo 23
0
0
12
0
7
-
4
0
2
0
9
16
0
0
8
13
0
7
21
-
12
0
0
-
+ pivote
4
25
0
0
19
26
0
2
21
-
0
9
16
0
0
8
13
0
25
0
0
0
19 23 26
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
16
Insertar el nodo 27
+
0
12
0
7
-
4
0
2
0
9
16
0
0
8
13
0
+
7
21
-
12
0
0
0
-
25
4
0
19 23 26
0
0
2
21
-
0
9
16
0
0
8
13
+
25
0
0
+
19 23 26
0
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
17
Insertar el nodo 28
(rotación simple izquierda)
+
+
0
+
7
-
4
0
2
0
25
0
8
13
0
19
-
4
+
16
0
21
-
0
9
+
7
21
-
12
0
12
9
0
2
+
+
0
25
16
0
0
8
13
0
0
19
23
26 pivote
23
+
pivote
26
0
27
0
27
28
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
0
7
-
4
0
2
+
0
9
0
8
13
-
0
19
0
23
B+
26
A0
1
27
2
En este caso los triángulos 1,2,3 son nulos.
3
28
0
2
21
-
4
25
16
0
+
7
21
-
12
0
+
+
0
9
25
16
0
0
8
13
0
19
0
23
A0
27
0
El nodo 28 es el hijo derecho del nodo 27 B 26
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
3
28
0
1 2
18
Insertar el nodo 0
(rotación simple derecha)
0
0
12
0
-
7
21
-
-
pivote 4
0
0
8
13
2
25
16
0
pivote
0
0
9
12
0
7
21
-
-
4
0
2
0
0
9
0
19
-
25
16
0
0
8
13
0
19
0
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 -) .
0
0
12
0
-
7
B
-
4
A
0
1
3
0
25
16
0
13
0
19
2
0
En este caso los triángulos 1,2,3 son nulos.
21
-
2
0
-
7
0
A
0
0
9
8
2
21
-
12
0
3
0
0
B
4
2
1
0
0
9
25
16
0
0
8
13
0
19
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
19
Insertar el nodo 8
(rotación doble derecha)
-
50
-
-
-
30
70
30
70
-
+
15
40
-
pivote
0
20
7
-
18
0
+
-
10
50
-
35
42
0
0
25
37
+
+
55
80
0
0
15
0
pivote
52
60
0
58
90
40
-
20
0
0
-
66
7
18
0
+
-
10
0
17
-
+
35
42
0
0
25
37
+
+
55
80
0
0
52
0
60
0
58
90
0
66
0
8
17
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 -) .
20
Insertar el nodo 8 (segunda parte)
(rotación doble derecha)
-
50
-
-
-
30
70
30
70
-
+
15
B
40
-
A
20
0
-
0
+
-
10
50
-
35
42
0
0
25
37
+
+
55
80
0
0
52
0
15
0
60
C
90
18
C
4
0
8
3
58
17
40
0
0
A
66
7
4
0
20
B
0
-
18
10
3
2
1
0
+
-
8
1
7
-
+
35
42
0
0
25
37
+
+
55
80
0
52
0
58
0
0
60
90
0
66
0
17
2
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 derecha
21
Insertar el nodo 36
(rotación doble izquierda)
-
50
-
-
-
30
70
30
70
-
+
15
40
pivote
-
0
20
7
-
18
0
17
0
+
-
10
50
-
35
42
0
0
25
37
+
+
55
80
0
0
52
0
58
15
40
pivote
0
60
-
+
-
90
20
10
0
0
-
66
7
18
0
+
-
35
42
0
0
25
37
+
+
55
80
0
0
52
0
60
0
58
90
0
66
0
17
36
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 +) .
22
Insertar el nodo 36 (segunda parte)
(rotación doble izquierda)
-
50
-
-
-
30
70
30
70
-
+
15
40
B
-
-
0
-
7
18
0
+
20
10
50
-
42
35
0
0
1
25
A
37
0
C
17
+
+
55
80
15
0
0
52
-
60
90
58
10
0
0
-
66
7
18
0
4
36
2
+
0
-
+
+
40
55
80
-
C 0
20
36
0
0
42
0
B 0
25
35
1
2
52
60
0
A
37
3
0
0
58
90
0
66
4
17
3
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
23
Descargar