Algoritmos e Estrutura de Dados II -...

59
Algoritmos e Estrutura de Dados II Árvore AVL Prof a Karina Oliveira [email protected] Fonte: Prof a Ana Eliza

Transcript of Algoritmos e Estrutura de Dados II -...

Algoritmos e Estrutura de Dados II

Árvore AVL

Profa Karina [email protected]

Fonte: Profa Ana Eliza

Algoritmos e Estrutura de Dados II - Karina Oliveira 2

• Árvores Binárias de Busca– Objetivo da Utilização

• Minimizar o número de comparações efetuadas, no pior caso, para uma busca com chaves de probabilidades de ocorrência idênticas.

– Restrições• Aplicações estáticas ⇒ Ideal• Aplicações dinâmicas ⇒ Desaconselhável

Introdução

Algoritmos e Estrutura de Dados II - Karina Oliveira 3

Introdução• Árvores Binárias de Busca– Problema

• Sucessivas inserções e remoções de nós em uma ABB fazem com que existam diferenças sensíveis entre os níveis das suas folhas, o que acarreta grandes diferenças de desempenho no acesso às informações.

• Pior caso: Árvores assimétricas.

Algoritmos e Estrutura de Dados II - Karina Oliveira 4

8

4

2

1

Introdução• Árvores Binárias de Busca– Problema

• Pior caso: Árvores assimétricas (semelhante a uma lista linear).

Algoritmos e Estrutura de Dados II - Karina Oliveira 5

Introdução• Árvores Binárias de Busca– Alternativa

• Tornar a árvore novamente completa, tão logo tal característica seja perdida após uma inserção ou remoção.

– Problema• Alto custo de reestruturação da árvore.• Solução pouco eficiente e, às vezes, impossível.

Algoritmos e Estrutura de Dados II - Karina Oliveira 6

Introdução• Árvores Binárias de Busca Completa

– Inserir 0

8

4

1

2

3 5

6

7

12

9

10

11 13

14

Algoritmos e Estrutura de Dados II - Karina Oliveira 7

Introdução• Árvores Binárias de Busca Completa

– Não é mais completa!

0

8

4

1

2

3 5

6

7

12

9

10

11 13

14

Algoritmos e Estrutura de Dados II - Karina Oliveira 8

Introdução• Árvores Binárias de Busca Completa (e Cheia)

7

3

0

1

2 4

5

6

11

8

9

10 12

13

14

Algoritmos e Estrutura de Dados II - Karina Oliveira 9

Árvores Balanceadas• Definição (Rigorosa)– Uma árvore é dita balanceada quando, para qualquer nó, as suas subárvores àesquerda e à direita possuem a mesma altura.

– Isso equivale a dizer que todas as suas folhas estão no mesmo nível.

– Ou seja, que a árvore está cheia.

Algoritmos e Estrutura de Dados II - Karina Oliveira 10

Árvores Balanceadas• Definição (Menos Rigorosa)– Uma árvore é considerada balanceada quando, para cada nó n, as alturas das subárvores à esquerda e à direita diferem, no máximo, de um.

– Essa diferença é chamada de “fator de balanceamento” do nó n• FatBal (n)

Algoritmos e Estrutura de Dados II - Karina Oliveira 11

Árvores Balanceadas• Definição (Menos Rigorosa)– Conceito introduzido em 1962 pelos matemáticos russos Adelson-Velskii e Landis.

– Conhecidas como árvores AVL.

Algoritmos e Estrutura de Dados II - Karina Oliveira 12

Árvores AVL• Características Básicas

– O fator de balanceamento deve constar em cada nó de uma árvore AVL.• FatBal(n) = Negativo ⇒ subárvore àesquerda mais alta.

• FatBal(n) = Positivo ⇒ subárvore àdireita mais alta.

• FatBal(n) = Zero ⇒ subárvores àesquerda e à direita com mesma altura.

Algoritmos e Estrutura de Dados II - Karina Oliveira 13

Árvores AVL• Exemplos de árvores balanceadas

25

10

20

30

28

0

+1 -1

0 0

25

10

5 20

30

28

0

0 -1

0 00

Algoritmos e Estrutura de Dados II - Karina Oliveira 14

Árvores AVL• Exemplos de árvores não balanceadas

10

5 20

30

+2

0 +2

0

25

-1

25

10

5 20

0

0 0

30

28

27

-2

-1

0

+1

Algoritmos e Estrutura de Dados II - Karina Oliveira 15

Árvores AVL• Operações Críticas– Inserção– Remoção

Algoritmos e Estrutura de Dados II - Karina Oliveira 16

Inserção em Árvores AVL• Sempre ocorre nas folhas;• Pode ocasionar: – O aumento da altura da subárvoreonde o nó foi inserido;

– A alteração dos fatores de balanceamento dos nós daquela subárvore.

Algoritmos e Estrutura de Dados II - Karina Oliveira 17

Inserção em Árvores AVL• Algoritmo de Inserção– Efetuar a inserção;– Ajustar os fatores de balanceamento;– Verificar a quebra do equilíbrio;– Se a árvore não estiver balanceada, corrigir a estrutura através de movimentações dos nós (Rotações).

Algoritmos e Estrutura de Dados II - Karina Oliveira 18

Inserção em Árvores AVL• Rotação

– Tipos de Rotação• Simples• Dupla

– Principais nós envolvidos:• Nó A: Nó ancestral mais próximo do nóinserido que possuía fator de balanceamento diferente de zero antes da inserção.

• Nó B: Filho de A na subárvore onde ocorreu a inserção.

Algoritmos e Estrutura de Dados II - Karina Oliveira 19

Inserção em Árvores AVL• Rotação Simples

– Utilizada quando a inserção ocorre do “lado de fora”.

– Dado um nó A, podemos ter: • Caso 1: Inserção na subárvore à esquerda do filho à esquerda de A ⇒ Rotação simples à direita.

• Caso 2: Inserção na subárvore à direita do filho à direita de A ⇒ Rotação simples àesquerda

Algoritmos e Estrutura de Dados II - Karina Oliveira 20

Inserção em Árvores AVL• Rotação Simples à Direita

B

A

T2 T3T1

A

B

T2

T3

T1

OBS: O nó foi inserido na subárvore T1

Algoritmos e Estrutura de Dados II - Karina Oliveira 21

Inserção em Árvores AVL• Rotação Simples à Direita – Exemplo:

25

10

5 20

30

28

0

0 -1

0 00B

25

10

5 20

0

0 0

30

28

27

A-2

-1

0

+1

Algoritmos e Estrutura de Dados II - Karina Oliveira 22

Inserção em Árvores AVL• Rotação Simples à Direita – Exemplo:

B

25

10

5 20

0

0 0

30

28

27

A-2

-1

0

+1

25

10

5 20

0

0 0

28

27 30

0

0

00

ANTES DEPOIS

Algoritmos e Estrutura de Dados II - Karina Oliveira 23

Inserção em Árvores AVL• Rotação Simples à Esquerda

OBS: O nó foi inserido na subárvore T3

A

BT1

T2

T3

B

T1

A

T2T3

Algoritmos e Estrutura de Dados II - Karina Oliveira 24

Inserção em Árvores AVL• Rotação Simples à Esquerda – Exemplo:

25

10

20

30

28

0

+1 -1

0 0 B

25

10

20

+2

+1

30

28

22

A

-1

-1

0

0

Algoritmos e Estrutura de Dados II - Karina Oliveira 25

Inserção em Árvores AVL• Rotação Simples à Esquerda – Exemplo:

25

20

22

30

28

0

0 -1

0 0100

B

25

10

20

+2

+1

30

28

22

A

-1

-1

0

0

ANTES DEPOIS

Algoritmos e Estrutura de Dados II - Karina Oliveira 26

Inserção em Árvores AVL• Rotação Dupla

– Utilizada quando a inserção ocorre do “lado de dentro” .

– Dado um nó A, podemos ter:• Caso 3: Inserção na subárvore à direita do filho à esquerda de A ⇒ Rotação dupla à direita.

• Caso 4: Inserção na subárvore à esquerda do filho à direita de A ⇒ Rotação dupla àesquerda.

Algoritmos e Estrutura de Dados II - Karina Oliveira 27

Inserção em Árvores AVL• Rotação Dupla– Principais nós envolvidos:

• Nó A: Nó ancestral mais próximo do nóinserido que possuía fator de balanceamento diferente de zero antes da inserção.

• Nó B: Filho de A na subárvore onde ocorreu a inserção.

• Nó C: Filho de B na subárvore onde ocorreu a inserção.

Algoritmos e Estrutura de Dados II - Karina Oliveira 28

Inserção em Árvores AVL• Rotação Dupla à Direita

OBS: O nó foi inserido na subárvore de raiz C (T2 ou T3)

A

B

T1

T2 T3

C

T4

C

T1

A

T3 T4

B

T2

Algoritmos e Estrutura de Dados II - Karina Oliveira 29

Inserção em Árvores AVL• Rotação Dupla à Direita - Exemplo

25

10

5 20

30

27

0

0 -1

0 0 0

25

10

5 20

30

27

+1

0 -2

0 0 +1

28

A

B

0

Algoritmos e Estrutura de Dados II - Karina Oliveira 30

Inserção em Árvores AVL• Rotação Dupla à Direita - Exemplo

25

10

5 20

30

27

+1

0 -2

0 0 +1

28

A

B

0

0

0 0

0 0 0 0

25

10

5 20

28

27 30

Algoritmos e Estrutura de Dados II - Karina Oliveira 31

Inserção em Árvores AVL• Rotação Dupla à Direita – Observações

– Uma rotação dupla à direita é equivalente à:1) Uma rotação simples à esquerda;2) Uma rotação simples à direita.

25

10

5 20

30

27

+1

0 -2

0 0 +1

28

A

B

0

0

0 0

0 0 0 0

25

10

5 20

28

27 30

(1)

(2)

ANTES DEPOIS

Algoritmos e Estrutura de Dados II - Karina Oliveira 32

Inserção em Árvores AVL• Rotação Dupla à Esquerda

OBS: O nó foi inserido na subárvore de raiz C (T2 ou T3)

A

BT1

T2 T3

C T4

C

T1

A

T2 T3

B

T4

Algoritmos e Estrutura de Dados II - Karina Oliveira 33

Inserção em Árvores AVL• Rotação Dupla à Esquerda - Exemplo

10

5 20

30

+1

0 +1

0

10

5 20

30

+2

0 +2

0

25

-1

A

B

Algoritmos e Estrutura de Dados II - Karina Oliveira 34

Inserção em Árvores AVL• Rotação Dupla à Esquerda - Exemplo

10

5 20

30

+2

0 +2

0

25

-1

A

B

10

5 25

30

+1

0 0

0

200

ANTES DEPOIS

Algoritmos e Estrutura de Dados II - Karina Oliveira 35

Inserção em Árvores AVL• Rotação Dupla à Esquerda – Observações

– Uma rotação dupla à direita é equivalente à:1) Uma rotação simples à direita;2) Uma rotação simples à esquerda.

10

5 25

30

+1

0 0

0

200

10

5 20

30

+2

0 +2

0

25

-1

A

B

(1)

(2)

Algoritmos e Estrutura de Dados II - Karina Oliveira 36

• Estrutura do nó de uma árvore AVLstruct avlNo{

int info;

avlNo *esq;

avlNo *dir;

int fatBal;

};

//Declaradas dentro do mainavlNo * raiz = NULL;bool status = false;

Implementação de Árvores AVL

Algoritmos e Estrutura de Dados II - Karina Oliveira 37

Implementação de Árvores AVL• Criação de um nóvoid createNode (avlNo * &raiz, int elem)

{

raiz = new avlNo;

raiz->info = elem;

raiz->esq = NULL;

raiz->dir = NULL;

raiz->fatBal = 0;

}

38

void insereAvl (avlNo * &raiz, int elem, bool &status) {if (raiz == NULL) {

createNode(raiz,elem);status = true;

}else if (elem == raiz->info){printf ("Elemento repetido. \n");return;

}else if (elem < raiz->info){insereAvl(raiz->esq,elem,status);if (status == true)

switch (raiz->fatBal) { case 1 : raiz->fatBal = 0; status = false; break;case 0 : raiz->fatBal = -1; break;case -1 : rotacionarDir(raiz,status); break;

}} else {

insereAvl(raiz->dir,elem,status);if (status == true)

switch (raiz->fatBal) { case -1 : raiz->fatBal = 0; status = false; break;case 0 : raiz->fatBal = 1; break;case 1 : rotacionarEsq(raiz,status); break;

}}

}

39

void rotacionarDir (avlNo * &a, bool &status) {avlNo *b, *c;b = a->esq;if (b->fatBal == -1) { // rotação simples

a->esq = b->dir;b->dir = a;a->fatBal = 0;a = b;

}else { // rotação dupla

c = b->dir;b->dir = c->esq;c->esq = b;a->esq = c->dir;c->dir = a; if (c->fatBal == -1)

a->fatBal = 1;else a->fatBal = 0;if (c->fatBal == 1)

b->fatBal = -1;else b->fatBal = 0;a = c;

}a->fatBal = 0;status = false;

}

40

void rotacionarEsq (avlNo * &a, bool &status) {avlNo * b, * c;b = a->dir;if (b->fatBal == 1) { // rotação simples

a->dir = b->esq;b->esq = a;a->fatBal = 0;a = b;

}else { // rotação duplac = b->esq;b->esq = c->dir;c->dir = b;a->dir = c->esq;c->esq = a;if (c->fatBal == 1)

a->fatBal = -1;else a->fatBal = 0;if (c->fatBal == -1)

b->fatBal = 1;else

b->fatBal = 0;a = c;

}a->fatBal = 0;status = false;

}

Remoção em Árvore AVL

Parte II

Algoritmos e Estrutura de Dados II - Karina Oliveira 42

Remoção em Árvores AVL• Considere que o elemento a ser

removido encontra-se na raiz de uma árvore T:1) A raiz não possui filhos: remover a raiz e

anular T;2) A raiz possui um único filho: remover a

raiz e substituí-la por seu filho;3) A raiz possui dois filhos: escolher o nó que

armazena o menor elemento na subárvoredireita e substituir a raiz por ele.

Algoritmos e Estrutura de Dados II - Karina Oliveira 43

Remoção em Árvores AVL• Pode ocasionar: – A diminuição da altura da árvore, e/ou;– A alteração dos fatores de balanceamento de seus nós.

Algoritmos e Estrutura de Dados II - Karina Oliveira 44

Remoção em Árvores AVL• Algoritmo de Remoção– Efetuar a remoção;– Ajustar os fatores de balanceamento;– Verificar a quebra do equilíbrio;– Se a árvore não estiver balanceada, corrigir a estrutura através de movimentações dos nós (Rotações).

Algoritmos e Estrutura de Dados II - Karina Oliveira 45

Remoção em Árvores AVL• Rotação

– Tipos de Rotação• Simples• Dupla

– Principais nós envolvidos:• Nó A: Nó ancestral mais próximo do ponto de remoção que possuía fator de balanceamento diferente de zero antes da remoção ser efetuada.

• Nó B: Filho de A na subárvore de maior altura.• Nó C: Filho de B na subárvore de maior altura (utilizado apenas em rotações duplas).

Algoritmos e Estrutura de Dados II - Karina Oliveira 46

Remoção em Árvores AVL• Exemplo:

5

3

1

2 4

8

6

7

119

10

0

-1 0

-1

0 00

0

0

0

-1

Remover 4

Algoritmos e Estrutura de Dados II - Karina Oliveira 47

Rebalancear ⇒ Rotação Simples à Direita

Remoção em Árvores AVL• Exemplo:

5

3

1

2

8

6

7

119

10

0

-1

-2

0 00

0

0

0

-1

A

B

5

2

31

8

6

7

119

100

0

0 00

0

0

+1

-10

Algoritmos e Estrutura de Dados II - Karina Oliveira 48

5

2

31

8

6

7

119

100

0

0 00

0

0

+1

-10

Remover 6

Remoção em Árvores AVL• Exemplo:

ANTES DEPOIS

5

2

31

8

7

119

100

0

0 0

0

+1

+1

00

Algoritmos e Estrutura de Dados II - Karina Oliveira 49

Remover 7

Remoção em Árvores AVL• Exemplo:

ANTES DEPOIS

5

2

31

8

7

119

100

0

0 0

0

+1

+1

00

5

2

31

8

119

100

0

0 0

0

+2

+1

0

Algoritmos e Estrutura de Dados II - Karina Oliveira 50

Rebalancear ⇒ Rotação Simples à Esquerda

Remoção em Árvores AVL• Exemplo:

5

2

31

8

119

100

0

0 0

0

+2

+1

00

A

B

5

2

31

10

8

9

110

0

0

+1 0

-1

+1

0

Algoritmos e Estrutura de Dados II - Karina Oliveira 51

Remoção em Árvores AVL• Exemplo:

Remover 3

5

2

31

10

8

9

110

0

0

+1 0

-1

+1

0

5

2

1

10

8

9

110

-1

0

+1 0

-1

+1

ANTES DEPOIS

Algoritmos e Estrutura de Dados II - Karina Oliveira 52

Remoção em Árvores AVL• Exemplo:

Remover 2

5

2

1

10

8

9

110

-1

0

+1 0

-1

+1

ANTES DEPOIS

5

10

8

9

11

0

0

+1 0

-1

+2

1

Algoritmos e Estrutura de Dados II - Karina Oliveira 53

Remoção em Árvores AVL• Exemplo:

5

10

8

9

11

0

0

+1 0

-1

+2

1

A

B

C

Rebalancear ⇒⇒⇒⇒ Rotação Dupla à Esquerda

8

5 10

9 110 0 0

0

0

1

-1

Algoritmos e Estrutura de Dados II - Karina Oliveira 54

Remoção em Árvores AVL• Exemplo:

8

5 10

9 110 0 0

0

0

1

-1

Remover 1

ANTES DEPOIS

8

5 10

9 110 0

0

+1

0

Algoritmos e Estrutura de Dados II - Karina Oliveira 55

Remoção em Árvores AVL• Exemplo:

Remover 5

ANTES DEPOIS

8

10

9 110 0

0

+28

5 10

9 110 0

0

+1

0

Algoritmos e Estrutura de Dados II - Karina Oliveira 56

Remoção em Árvores AVL• Exemplo:

Rebalancear ⇒⇒⇒⇒ Rotação Simples à Esquerda

8

10

9 110 0

0

+2 A

B8

10

9

110

0

-1

+1

Algoritmos e Estrutura de Dados II - Karina Oliveira 57

Remoção em Árvores AVL• Observação:– Enquanto a inserção de uma única chave pode resultar em uma rotação de dois ou três nós no máximo, a remoção pode exigir uma rotação em cada um dos nós ao longo de toda a trajetória de busca.

– Ver exercício a seguir.

Algoritmos e Estrutura de Dados II - Karina Oliveira 58

Remoção em Árvores AVL• Exercício: Remover 4

5

3

2

1 4

10

8

129

11

0

+1 0

-1

0 0-1

+1

-1

+1

-1

0

7

6

Algoritmos e Estrutura de Dados II - Karina Oliveira 59

Bibliografia Recomendada• SZWARCFITER, Jayme Luiz; MARKENZON, Lilian. Estruturas de Dados e seus Algoritmos. 2. ed. rev. Rio de Janeiro: LTC, 1994.

• WIRTH, Niklaus. Algoritmos e estruturas de dados. 1. ed. Rio de janeiro: LTC, 1999.