Árvores avl - autenticação · – se diferirem, equilibrar a sub-árvore com raíz nesse nó,...

80
IAED, 2014/2015 Árvores AVL

Upload: duongmien

Post on 05-Dec-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

Árvores AVL

Page 2: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 2

Resumo da aula de hoje

•  Recapitular algumas ideias da última aula –  Pesquisa, inserção, remoção & travessias em árvores binárias

de pesquisa.

•  Árvores binárias equilibradas –  Exemplo: Rotações, pesquisa, inserção e remoção em

AVL trees

•  Exercícios

Page 3: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 3

Estrutura de uma Árvore Binária

#include "Item.h" typedef struct node { Item item; struct node *l; struct node *r; } *link;

r

r r

l

l l

Page 4: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 4

Árvores de Procura Binárias (BST)

•  Nós na sub-árvore esquerda tem chaves menores ou iguais que a raíz

•  Nós na sub-árvore direita tem chaves maiores ou iguais que a raíz

20

12 32

8 18 23 45

2 9

Page 5: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 5

Árvores de Procura Binárias (BST)

•  Vamos procurar o 2 •  No pior caso, a pesquisa escala com a profundidade da

árvore.

20

12 32

8 18 23 45

2 9

Page 6: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 6

Inserção de um novo elemento

•  Vamos inserir o elemento “9”

20

12 32

8 18 23 45

2 9

Page 7: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

•  Mais difícil: 3 possibilidades. 1. 2. 3.

Remoção de um elemento

7

5

45

20

22

Page 8: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

1.  Se o nó não tiver filhos à fácil... Basta apagar.

2.  Se o nó tiver um só filho... Também é fácil.

3.  Remoção de um nó interno: 1.  substituímos o elemento a remover pelo maior dos elementos à

esquerda do elemento a ser removido. 2.  removemos esse elemento (que estará necessariamente nas

condições 1 ou 2)

12

Exemplos: Remoção de um elemento

Page 9: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 13

Travessia em Pre-Order

•  Visita raíz antes dos filhos: Output: 20, 12, 8, 2, 9, 18, 32, 23, 45

void traverse(link h) { if (h == NULL) return; visit(h->item); traverse(h->l); traverse(h->r); }

20

12 32

8 18 23 45

2 9

Page 10: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 14

Travessia em In-Order (sorted!!)

•  Visita a raíz depois de visitar o filho esquerdo e antes de visitar o direito

Output: 2, 8, 9, 12, 18, 20, 23, 32, 45 void traverse(link h) { if (h == NULL) return; traverse(h->l); visit(h); traverse(h->r); }

20

12 32

8 18 23 45

2 9

Page 11: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 15

Travessia em Post-Order

•  Apenas visita a raíz depois de visitar o filho direito e o esquerdo

•  Output: 2, 9, 8, 18, 12, 23, 45, 32, 20 •  Exemplo de aplicação: avaliação de expressões posfixadas void traverse(link h) { if (h == NULL) return; traverse(h->l); traverse(h->r); visit(h); }

20

12 32

8 18 23 45

2 9

Page 12: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 16

Pesquisas em BST

•  Geralmente eficiente: •  No pior caso, para uma árvore desequilibrada

–  Ordem de inserção: 1,2,3,4,5,6,7,8

•  No caso de chaves aleatórias,

•  Comparação com pesquisa binária em tabelas: –  Tempo de pesquisa comparável –  Tempo de inserção muito mais rápido

(log )O N( )O N

(log )O N

( )O N

Page 13: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 17

Árvores Binárias Equilibradas

•  Evitam o pior caso de •  Algum overhead na construção •  Alternativa:

–  Reequilibrar uma árvore, depois de construída –  Usar aleatoriedade –  Usar técnicas especiais de construção

(AVL, Red-Black, etc)

( )O N

E

F

B

D

A

C

0

1

2

3

4

5

Page 14: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 18

Árvores AVL (Adelson-Velskii e Landis)

•  BST em que, para cada nó interno, a profundidade (height) de ambos os filhos difere, no máximo, em 1

20

12 32

8 18 23 45

2 9 0

1

2

0 0 0

1

3

0

Nota: Estamos a considerar que a profundidade de uma folha = 0

Height

Page 15: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 19

Árvores AVL (Adelson-Velskii e Landis)

•  Será que esta árvore esta “equilibrada”?

20

12 32

8 18 23 45

2 9 0

1

2

0 0 0

1

3

0

Page 16: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 21

Inserção em Árvores AVL

•  Inserção de um elemento pode desequilibrar a árvore

20

12 32

8 18 23 45

2 9 0

1

2

0 0 0

1

3

0

Page 17: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 22

Inserção em Árvores AVL

•  Inserção de um elemento pode desequilibrar a árvore Vamos inserir o “1”!

20

12 32

8 18 23 45

2 9 0

1

2

0 0 0

1

3

0

Height

Page 18: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 23

Inserção em Árvores AVL

•  Inserção de um elemento pode desequilibrar a árvore

20

12 32

8 18 23 45

2 9 1

2

3

0 0 0

1

4

0

1 0

Height

Page 19: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 24

Inserção em Árvores AVL

•  Inserção de um elemento pode desequilibrar a árvore

20

12 32

8 18 23 45

2 9 1

2

3

0 0 0

1

4

0

1 0

árvore desequilibrada !

Height

Page 20: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 25

Inserção em Árvores AVL

•  Pode ser necessário equilibrar após a inserção

árvore desequilibrada !

Height 20

12 32

8 18 23 45

2 9 1

2

3

0 0 0

1

4

0

1 0

Page 21: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 26

Inserção em Árvores AVL

20

8

23 2 12 1

2

3

0

32

45

0 0

0

1

1

1 0

árvore equilibrada !

9 18

Height

20

12 32

8 18 23 45

2 9

1

Page 22: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 27

Inserção em Árvores AVL

•  Em vez da altura (height) podemos analisar directamente o balance factor = height (left) – height (right)

20

8

23 2 12 1

2

3

0

32

45

0 0

0

1

1

1 0

árvore equilibrada !

9 18

Height

Page 23: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 28

Inserção em Árvores AVL

•  Em vez da altura (height) podemos analisar directamente o balance factor = height (left) – height (right)

20

8

23 2 12 1

0

1

0

32

45

0 0

0

0

0

1 0

árvore equilibrada !

9 18

Balance factor

Page 24: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 29

Operações de Rotação - Esquerda

link rotL(link h) { link x = h->r; h->r = x->l; x->l = h; return x; }

F

D H

B E G I

A C

F

D

H

B E

G

I

A C

x

h h

x

Page 25: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 30

Operações de Rotação - Direita

link rotR(link h) { link x = h->l; h->l = x->r; x->r = h; return x; }

D

B H

A C F I

E G

D

B

H A C

F

I

E

G

x

h x

h

Page 26: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 31

Inserção em Árvores AVL

•  Inserir novo elemento, numa folha, como numa BST normal

•  Percorrer o caminho desde a nova folha até à raíz –  Para cada nó encontrado, verificar se as alturas dos dois filhos

(esquerdo e direito) não diferem em mais do que 1 –  Se diferirem, equilibrar a sub-árvore com raíz nesse nó,

efectuando uma rotação (simples ou dupla)

•  Após equilibrar a sub-árvore com raíz num determinado nó x, não será necessário equilibrar as sub-árvores com raíz nos antepassados de x –  Terminar após uma equilibragem, ou quando atingirmos a raíz

Page 27: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 32

Equilibragem de Árvores AVL

•  Rotação Simples I (left)

A B

C A

B C

rotação esquerda

Page 28: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 33

Equilibragem de Árvores AVL

•  Rotação Simples II (right)

C B

A A

B C

rotação direita

Page 29: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 34

AVL Ex. 1: Inserção com rotações simples

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 18

45

36 63

27 39 72 54 0 0

0

0 0

0

0

Balance factor

Page 30: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 35

AVL Ex. 1: Inserção com rotações simples

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 18 •  Esta BST está equilibrada?

45

36 63

27 39 72 54 0 1

1

0 0

0

1

18 0

Balance factor

Page 31: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 36

AVL Ex. 1: Inserção com rotações simples

•  Agora vamos introduzir o elemento 9... Está equilibrada? •  NÃO!!!! •  Vamos subir do 9 em direção à raiz até encontrar um elemento

desequilibrado. 45

36 63

27 39 72 54 0 2

2

0 0

0

2

18 1

9 0

Balance factor

Page 32: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 37

AVL Ex. 1: Inserção com rotações simples

•  Para equilibrar, basta fazer uma rotação simples para a direita (rotR) aplicada ao elemento 27

45

36 63

27 39 72 54 0 2

2

0 0

0

2

18 1

9 0

Page 33: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

AVL Ex. 1: Inserção com rotações simples

•  Para equilibrar, basta fazer uma rotação simples para a direita (rotR) aplicada ao elemento 27

•  ...e já está!!!

45

36 63

18 39 72 54 0 0

1

0 0

0

1

9 0

27 0

Page 34: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 39

AVL Ex. 1: Inserção com rotações simples

45

36 63

27 39 72 54 0 2

2

0 0

0

2

18 1

9 0

RECEITA 1: Quando o novo nó é inserido na sub-árvore da esquerda, da sub-árvore da esquerda do elemento desequilibrado, basta-nos aplicar uma rotR a esse elemento.

Page 35: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 40

AVL Ex. 2: Inserção com rotações simples

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 91

45

36 63

27 39 72 54 0 0

0

0 -1

-1

-1

89 0

Page 36: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 41

AVL Ex. 2: Inserção com rotações simples

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 91

45

36 63

27 39 72 54 0 0

0

0 -2

-2

-2

89 -1

91 0

Page 37: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 42

AVL Ex. 2: Inserção com rotações simples

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 91

45

36 63

27 39 72 54 0 0

0

0 -2

-2

-2

89 -1

91 0

RECEITA 2: Quando o novo nó é inserido na sub-árvore da direita, da sub-árvore da direita, do elemento desequilibrado, basta-nos aplicar uma rotL a esse elemento.

Page 38: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 43

AVL Ex. 2: Inserção com rotações simples

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  RESULTADO FINAL: 45

36 63

27 39 89 54 0 0

0

0 0

-1

-1

91 0

72 0

Page 39: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 44

AVL Ex. 3: Inserção com rotações duplas

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 56

45

36 63 0

0

1

-1

50

Page 40: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 45

AVL Ex. 3: Inserção com rotações duplas

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 56

45

36 63

50

0

-1

2

-2

56 0

Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita

Page 41: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 46

Equilibragem de Árvores AVL

•  Rotação Dupla I

A B

C

rotação esquerda

B A

C

Esquerda-Direita

Page 42: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 47

Equilibragem de Árvores AVL

•  Rotação Dupla I (cont)

rotação esquerda, direita

A B

C A

B C

Esquerda-Direita

Page 43: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 48

Equilibragem de Árvores AVL

•  Rotação Dupla II

C B

B C

A

rotação direita

A

Direita-Esquerda

Page 44: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 49

Equilibragem de Árvores AVL

•  Rotação Dupla II (cont)

C B

A B

C A

rotação direita, esquerda

Direita-Esquerda

Page 45: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 50

AVL Ex. 3: Inserção com rotações duplas

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 56

45

36 63

50

0

-1

2

-2

56 0

Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita rotL

Page 46: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 51

AVL Ex. 3: Inserção com rotações duplas

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 56

45

36 63 0

1

2

-2

50

rotL 56

0

Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita

Page 47: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 52

AVL Ex. 3: Inserção com rotações duplas

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 56

45

36 63 0

1

2

-2

50

rotR

56

0

Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita

Page 48: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 56

63 0

53

AVL Ex. 3: Inserção com rotações duplas

45

36 56 0

0

0

-1

rotR

50

Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita

Page 49: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos inserir o elemento 56

•  RESULTADO FINAL:

63 0

54

AVL Ex. 3: Inserção com rotações duplas

45

36 56 0

0

0

-1

50

Page 50: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 55

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Depois de inserir o elemento 65 temos:

AVL Ex. 4: Inserção com rotações duplas

45

36 63 0

-1

70 0

1

Page 51: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

65 0

56

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Depois de inserir o elemento 65 temos:

AVL Ex. 4: Inserção com rotações duplas

45

36 63 0 -2

-2

70 1

rotR Receita 4: O novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado!! O que fazer ? Rotação dupla Direita-Esquerda

Page 52: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 57

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Depois de inserir o elemento 65 temos:

AVL Ex. 4: Inserção com rotações duplas

45

36 63 0 -2

-2

65

70

-1

Receita 4: O novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado!! O que fazer ? Rotação dupla Direita-Esquerda

rotR

Page 53: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 58

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Depois de inserir o elemento 65 temos:

AVL Ex. 4: Inserção com rotações duplas

45

36 63 0 -2

-2

65

70

-1

rotL

Receita 4: O novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado!! O que fazer ? Rotação dupla Direita-Esquerda

Page 54: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 59

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Depois de inserir o elemento 65 temos :

AVL Ex. 4: Inserção com rotações duplas

45

36 65 0 0

-1

70 63 0 0

Receita 4: O novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado!! O que fazer ? Rotação dupla Direita-Esquerda

rotL

Page 55: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 60

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Depois de inserir o elemento 65 temos (resultado final):

AVL Ex. 4: Inserção com rotações duplas

45

36 65 0 0

-1

70 63 0 0

Page 56: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 61

Resumo

Caso 4: Se o novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado, fazemos uma rotação dupla Direita-Esquerda

Caso 3: Se o novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado, fazemos uma rotação dupla Esquerda-Direita

Caso 2: Se o novo nó é inserido na sub-árvore da direita, da sub-árvore da direita do elemento desequilibrado, basta-nos aplicar uma rotação simples para a esquerda aplicada a esse elemento.

Caso 1: Se o novo nó é inserido na sub-árvore da esquerda, da sub-árvore da esquerda do elemento desequilibrado, basta-nos aplicar uma rotação simples para a direita aplicada a esse elemento.

Page 57: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 62

Remoção em Árvores AVL

•  Remoção de um elemento pode desequilibrar a árvore

20

12 32

8 18 45

2 9 0

0

1

0 0

-1

1

0

Balance factor

Page 58: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

0

63

Remoção em Árvores AVL

•  Remoção de um elemento pode desequilibrar a árvore

20

12 32

8 18

2 9 0

0

1

0

2

0

árvore desequilibrada !

Page 59: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 64

Remoção em Árvores AVL

•  Remover um nó como numa BST normal •  Percorrer o caminho desde o nó removido até à raíz

–  Para cada nó encontrado, verificar se as alturas dos dois filhos (esquerdo e direito) não diferem em mais do que 1

–  Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação simples ou uma rotação dupla

•  Após equilibrar a sub-árvore com raíz num determinado nó x, poderá ser necessário equilibrar as sub-árvores com raízes nos antepassados de x –  Terminar apenas quando atingirmos a raíz

Page 60: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 65

AVL Ex. 5: Remoção de nós

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos remover o elemento 72:

45

36 63

27 72 1

0

-1 0

-1

1

40 0

18 0

39

Page 61: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 66

AVL Ex. 5: Remoção de nós

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos remover o elemento 72:

45

36 63

27 1

0

-1

0

2

40 0

18 0

rotR

39

Page 62: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 67

AVL Ex. 5: Remoção de nós

•  Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)

•  Vamos remover o elemento 72:

36

27

18 0

1 1

-1

40 0

63 0

39

45

1

Page 63: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 68

Pesquisa em Árvores AVL

•  Pesquisa é realizada como numa árvore BST normal

•  Pesquisa não altera a árvore

Page 64: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 69

Desempenho de Árvores AVL

•  Uma equilibragem (rotação dupla ou simples):

•  Pesquisa: O (log N) –  Profundidade é , não é necessário equilibrar

•  Inserção: O (log N) –  Procurar a posição para inserir é O (log N) –  Manter equilibrada é O (log N) : subir na árvore e equilibrar 1 vez

•  Remoção: O (log N) –  Procurar o elemento a remover é O (log N) –  Manter equilibrada é O (log N) : subir na árvore e equilibrar no

máximo O (log N) vezes

(1)O

(log )O N

Page 65: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 70

Exercício 1

Construa uma árvore AVL inserindo os seguintes elementos (por esta ordem):

63, 9, 19, 27, 18, 108, 99 e 81 Desenhe a árvore equilibrada resultante, e escreva o resultado de uma travessia pre-order sobre essa árvore.

Page 66: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 71

Exercício 1

63

9

19

19

9 RotL(9) + RotR(63)

à

27 18 108

99

81

<-RotR

63

63, 9, 19, 27, 18, 108, 99 e 81

Page 67: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 72

Exercício 1

108

19

9

27 18 99

81

Travessia pre-order: 19, 9, 18, 63, 27, 99, 81, 108

0 0

0 0

0

-1 -1

-1 Balance factors

63

Page 68: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 73

Exercício 2

108

19

9

27 18 99

81

Vamos agora remover o elemento 18 !!

0 0

0 0

0

-1 -1

-1 Balance factors

63

Page 69: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 74

Exercício 2

108

19

9

27 99

81

Vamos agora remover o elemento 18 !!

0

0 0

0

-1 0

-2 nó desequilibrado!

63

Page 70: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 75

Exercício 2

108

19

9

27 99

81

O que fazer?

0

0 0

0

-1 0

-2 nó desequilibrado!

63

Page 71: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 76

Exercício 2

108

19

9

27 99

81

O que fazer? Rodar o elemento desequilibrado para a esquerda...

0

0 0

0

-1 0

-2 nó desequilibrado!

63

Page 72: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015 77

Exercício 2

63

19

81 108

Já está!

0 0

0 0

0

99

9 27

Page 73: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

78

ADTs + AVLs: Alterações ao código anterior

#ifndef _ST_ #define _ST_ #include <stdlib.h> #include <stdio.h> #include "Item.h" typedef struct STnode* link; void STinit(link*); int STcount(link); Item STsearch(link,Key); void STinsert(link*,Item); void STdelete(link*,Key); void STsort(link,void (*visit)(Item)); void STfree(link*); #endif

ST.h

Page 74: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

79

#include "ST.h” struct STnode { Item item; link l, r; int height}; link NEW(Item item, link l, link r) { link x = (link)malloc(sizeof(struct STnode)); x->item = item; x->l = l; x->r = r; x->height=1;

return x; } int height(link h){ if (h == NULL) return 0; return h->height; }

ST.c (alterações a verde)

Height vai guardando a altura do nó

Page 75: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

80

link rotL(link h) { int height_left, height_right;

link x = h->r; h->r = x->l; x->l = h; height_left = height(h->l);

height_right = height(h->r);

h->height = height_left > height_right ? height_left + 1 : height_right + 1;

height_left = height(x->l);

height_right = height(x->r); x->height =

height_left > height_right ? height_left + 1 : height_right + 1; return x; }

ST.c (alterações a verde)

Actualizar a altura dos nós

envolvidos

Page 76: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

81

link rotR(link h) { int height_left, height_right;

link x = h->l; h->l = x->r; x->r = h; height_left = height(h->l);

height_right = height(h->r);

h->height = height_left > height_right ? height_left + 1 : height_right + 1;

height_left = height(x->l);

height_right = height(x->r); x->height =

height_left > height_right ? height_left + 1 : height_right + 1; return x; }

ST.c (alterações a verde)

Actualizar a altura dos nós

envolvidos

Page 77: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

82

link rotLR(link h) /*rotação dupla esquerda direita*/ {

if (h==NULL) return h; h->l = rotL(h->l); return rotR(h); } link rotRL(link h) /*rotação dupla direita esquerda*/

{ if (h==NULL) return h; h->r = rotR(h->r); return rotL(h); }

int Balance(link h) {/*Balance factor*/ if(h == NULL) return 0; return height(h->l) - height(h->r); }

ST.c (alterações a verde)

Page 78: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

83

link AVLbalance(link h) { int balanceFactor; if (h==NULL) return h;

balanceFactor= Balance(h); if(balanceFactor>1) { if (Balance(h->l)>0) h=rotR(h); else h=rotLR(h); }

else if(balanceFactor<-1){ if (Balance(h->r)<0) h = rotL(h); else h = rotRL(h); } else{

int height_left = height(h->l);

int height_right = height(h->r); h->height = height_left > height_right ? height_left + 1 : height_right + 1;

} return h; }

ST.c (alterações a verde)

Page 79: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

84

link insertR(link h, Item item) { if (h == NULL) return NEW(item, NULL, NULL); if (less(key(item), key(h->item))) h->l = insertR(h->l, item); else h->r = insertR(h->r, item); h = AVLbalance(h); return h; }

ST.c (alterações a verde)

Page 80: Árvores AVL - Autenticação · – Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação (simples ou dupla) • Após equilibrar a sub-árvore com

IAED, 2014/2015

85

link deleteR(link h, Key k) { if (h == NULL) return h; else if (less(k, key(h->item))) h->l = deleteR(h->l,k);

else if (less(key(h->item), k)) h->r = deleteR(h->r,k) ; else{ if (h->l !=NULL && h->r !=NULL){ link aux = max(h->l); {Item x; x = h->item; h->item = aux->item; aux->item = x;} h->l = deleteR(h->l, key(aux->item));

} else { link aux = h; if (h->l == NULL && h->r == NULL) h=NULL; else if (h->l == NULL) h = h->r; else h = h->l;

deleteItem(aux->item); free(aux); } }

h = AVLbalance(h); return h; }

ST.c (alterações a verde)