Árboles avl m.c. meliza contreras gonzález. 2 ¿qué es un árbol avl? es un árbol binario de...

Post on 25-Jan-2016

219 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

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

top related