Estrutura de Dados
11 – Árvores AVL
Engenharia de Computação - Unipampa
• Revisão – Árvores Binárias
• Introdução
• Representação
• Inserção
• Remoção
Tópicos
• Uma árvore em que cada nodo tem zero, um ou dois
filhos, ou seja, de no máximo grau dois.
• Uma árvore binária é:
• Uma árvore vazia; ou
• Um nodo raiz com duas subárvores:
- a subárvore da direita (sad)
- a subárvore da esquerda (sad)
• ABB tem uma relação de ordem nas subárvores
Engenharia de Computação - Unipampa
Revisão
• Problemas com ABB:
• Desbalanceamento progressivo
• Exemplo: - inserção: 1, 13, 24, 27, 56Revisão
1
13
24
27
56
Alternativa de solução:
• Árvores balanceadas
• AVL
• Árvores de altura balanceada ou de altura equilibrada
foram introduzidas em 1962 por Adelson-Velskii e Landis,
também conhecidas como árvores AVL.
• Devido ao balanceamento da árvore, as operações de
busca, inserção e remoção em uma árvore são otimizadas.
• O balanceamento mais comum e mais simples é aquele
que pressupõe uma distribuição uniforme dos acessos às
várias chaves. Com esse pressuposto, o balanceamento
passa a ser por altura, ou seja, busca-se minimizar a altura
da árvore, fazendo com que os nós sejam compactados
juntos a raiz.
Engenharia de Computação - Unipampa
Introdução
• Em razão do grande esforço exigido para manter uma
árvore completamente balanceada, que pode
não ser compensado pelo ganho em eficiência no
processo de busca, assumem importância as
árvores que apresentam balanceamento não
completo, mas sim, próximo dele.
• Estas árvores beneficiam o processo de busca,
exigindo
manutenção
pouco
onerosa
do
balanceamento.
• As árvores AVL entram nesse contexto.
Introdução
•
Engenharia de Computação - Unipampa
Árvore AVL
• Exemplo:
• O fator de balanceamento ou fator de
equilíbrio de um nó a em uma árvore binária é
definido como sendo onde e são as alturas
das subárvores esquerda e direita de A,
respectivamente.
• Para qualquer nó a numa árvore AVL, o fator
de balanceamento assume o valor -1, 0 ou +1
• O fator de balanceamento de uma folha é zero.
Engenharia de Computação - Unipampa
Fator de Balanceamento
Engenharia de Computação - Unipampa
Fator de Balanceamento
Engenharia de Computação - Unipampa
Fator de Balanceamento
• Verifique os fatores de balanceamento de cada
nodo.
Exercícios de fixação
130 150 100 200 120 80 120 130 100 200 110 80• Verifique os fatores de balanceamento de cada
nodo.
Engenharia de Computação - Unipampa
Exercícios de fixação - Respostas
01/02/2018 15 130 150 100 200 120 80 110 120 130 100 200 110 80 150
+1
-1
-1
0
0
0
0
0
0
+1
-2
0
-1
AVL
Não AVL
• Verifique os fatores de balanceamento de cada
nodo.
Exercícios de fixação
42 88 15 63 27 6 94 20 57 71 42 88 15 6 42 88 15 63 27 20 57 71• Verifique os fatores de balanceamento de cada
nodo.
Engenharia de Computação - Unipampa
Exercícios de fixação - Respostas
01/02/2018 17 42 88 15 63 27 6 94 20 57 71 42 88 15 63 27 6 94 42 88 15 63 27 20 57 71
0
0
0
0
0
0
0
AVL: completamente balanceada
0
0
0
0
+1
-1
0
0
0
0
0
0
0
+1
-2
0
+2
• Como manter uma árvore AVL sempre
balanceada após uma inserção ou exclusão?
• Através de uma operação de ROTAÇÃO
• São quatro operações
• Característica da operação
• preservar a ordem das chaves
• basta uma execução da operação de rotação para
tornar a árvore AVL novamente
• O processo de rebalanceamento é conduzido utilizando 4 tipos de rotações: Esquerda, Direita, Esquerda-Direita, Direita-Esquerda
• Esquerda e Direita são simétricas entre si assim como Esquerda-Direita e Direita-Esquerda
• As rotações são caracterizadas pelo ancestral mais próximo A do novo nó inserido Y
• Direita: Y inserido na subárvore esquerda da subárvore esquerda de A
• Esquerda-Direita: Y inserido na subárvore direita da subárvore esquerda de A • Esquerda: Y inserido na subárvore direita da subárvore direita de A
• Direita-Esquerda: Y inserido na subárvore esquerda da subárvore direita de A
• Seja B o filho de A no qual ocorreu a inserção de Y
• Direita (A = +2; B = +1) Esquerda (A = -2; B = -1)
• Esquerda-Direita (A = +2; B = -1) Direita-Esquerda(A = -2; B = +1)
Engenharia de Computação - Unipampa
Rotações
Rotação Direita
• Toda vez que uma subárvore fica com um fator:
• positivo e sua subárvore da esquerda também tem um
fator positivo
ROTAÇÃO À DIREITA
110
100
80
+2
+1
Engenharia de Computação - Unipampa
Rotação Direita
01/02/2018 21120
110
150
100
80
130
200
120
110
150
100
80
130
200
+1
0
0
0
+2
+1
0
Rotação Direita
120
110
Rotação Direita150
100
80
130
200
120
100
150
80
110
130
200
+1
+2
0
0
0
0
0
0
0
0
0
0
0
+1
Engenharia de Computação - Unipampa
Rotação Direita
01/02/2018 23A
B
+2
+1
a
Assumindo a e aux ponteiros para as subárvores com raiz A e B:aux = a->esq; a->esq = aux->dir; aux->dir = a; a = aux;
T2
T3
T1
T1
,
T2
,
T3
e
T4
são subárvores
(vazias ou não)
Rotação Direita
A
B
a
Assumindo a e aux ponteiros para as subárvores com raiz A e B:aux = a->esq; a->esq = aux->dir; aux->dir = a; a = aux;
T2
T3
T1
aux
Engenharia de Computação - Unipampa
Rotação Direita
01/02/2018 25A
B
a
Assumindo a e aux ponteiros para as subárvores com raiz A e B:
aux = a->esq; a->esq = aux->dir; aux->dir = a; a = aux;
T2
T3
T1
aux
Rotação Direita
A
B
a
Assumindo a e aux ponteiros para as subárvores com raiz A e B:
aux = a->esq; a->esq = aux->dir; aux->dir = a; a = aux;
T2
T3
T1
aux
Engenharia de Computação - Unipampa
Rotação Direita
01/02/2018 27
A
B
a
Assumindo a e aux ponteiros para assubárvores com raiz A e B: aux = a->esq; a->esq = aux->dir; aux->dir = a; a = aux;
T2
T3
T1
aux
Rotação Direita
110
100
80
+2
0
+1
Rotação Direita100
80
110
0
0
0
Engenharia de Computação - Unipampa
Rotação Direita
01/02/2018 2942
15
88
6
27
+1
0
0
0
0
Incluir
4
42
15
88
6
27
+2
0
+1
+1
0
4
0
Rotação Direita
Rotação
Direita
42
15
88
6
27
+2
0
+1
+1
0
4
0
15
6
42
4
27
0
0
+1
0
0
88
0
Ajustado!
Engenharia de Computação - Unipampa
Rotação Esquerda
01/02/2018 31• Toda vez que uma subárvore fica com um fator:
• negativo e sua subárvore da esquerda também tem um
fator negativo
ROTAÇÃO À ESQUERDA
130
150
200
0
-2
-1
Rotação Esquerda
120
100
130
150
200
80
110
120
100
130
150
200
80
110
-1
0
0
0
-2
-1
Engenharia de Computação - Unipampa
Rotação Esquerda
01/02/2018 33120
100
150
80
110
130
200
120
100
130
150
200
80
110
Rotação Esquerda-1
0
0
0
0
-2
-1
0
0
0
0
0
0
0
Rotação Esquerda
A
-2
-1
a
Assumindo a e aux ponteiros para as subárvores com raiz A e B: aux = a->dir; a->dir = aux->esq; aux->esq = a; a = aux;T2
T1
T1
,
T2
,
T3
e
T4
são subárvores
(vazias ou não)
T3
B
Engenharia de Computação - Unipampa
Rotação Esquerda
01/02/2018 35
aux
Assumindo a e aux ponteiros para as subárvores com raiz A e B:
aux = a->dir; a->dir = aux->esq; aux->esq = a; a = aux;
A
a
T2
T1
T3
B
Rotação Esquerda
Assumindo a e aux ponteiros para as subárvores com raiz A e B:
aux = a->dir; a->dir = aux->esq; aux->esq = a; a = aux;
aux
A
T2
T1
T3
B
a
Engenharia de Computação - Unipampa
Rotação Esquerda
01/02/2018 37
Assumindo a e aux ponteiros para as subárvores com raiz A e B:
aux = a->dir; a->dir = aux->esq; aux->esq = a; a = aux;
aux
A
T2
T1
T3
B
a
Rotação Esquerda
Assumindo a e aux ponteiros para as subárvores com raiz A e B:
aux = a->dir; a->dir = aux->esq; aux->esq = a; a = aux;
aux
A
T2
T1
T3
B
a
Engenharia de Computação - Unipampa
Rotação Esquerda
01/02/2018 39150
130
200
130
150
200
Rotação Esquerda0
-2
-1
0
0
0
Rotação Esquerda
42
15
88
94
67
-1
0
0
0
0
Incluir
90
42
15
88
94
67
-2
-1
0
0
1
90
0
Engenharia de Computação - Unipampa
Rotação Esquerda
01/02/2018 4188
42
94
90
67
0
+1
0
0
0
15
0
42
15
88
94
67
-2
-1
0
0
1
90
0
Rotação
Esquerda
Ajustado!
Rotação Esquerda-Direita
• Toda vez que uma subárvore fica com um fator:
• positivo e sua subárvore da esquerda também tem um
fator negativo
ROTAÇÃO À ESQUERDA-DIREITA
110
80
100
+2
-1
Engenharia de Computação - Unipampa
Rotação Esquerda-Direita
01/02/2018 43DIREITA
ESQUERDA120
110
150
80
100
130
200
120
110
150
100
80
130
200
120
100
150
80
110
130
200
Rotação Esquerda-Direita
A
B
T1
T4
C
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->esq; pC = pB->dir; pB->dir = pC->esq; Rotação Esquerda! pC->esq = pB; pA->esq = pC->dir; pC->dir = pA; pA = pC;pA
Engenharia de Computação - Unipampa
Rotação Esquerda-Direita
01/02/2018 45A
B
T1
T2
T4
C
T3
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->esq; pC = pB->dir; pB->dir = pC->esq; Rotação Esquerda! pC->esq = pB; pA->esq = pC->dir; pC->dir = pA; pA = pC;pA
pB
Rotação Esquerda-Direita
A
B
T1
T4
C
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->esq; pC = pB->dir; pB->dir = pC->esq; Rotação Esquerda! pC->esq = pB; pA->esq = pC->dir; pC->dir = pA; pA = pC;pA
pB
pC
Engenharia de Computação - Unipampa
Rotação Esquerda-Direita
01/02/2018 47A
B
T1
T2
T4
C
T3
Assumindo a e aux ponteiros para as subárvores com raiz A e B: pB = pA->esq; pC = pB->dir;pB->dir = pC->esq; Rotação Esquerda! pC->esq = pB; pA->esq = pC->dir; pC->dir = pA; pA = pC;
pA
pB
pC
Rotação Esquerda-Direita
A
B
T1
T4
C
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->esq; pC = pB->dir; pB->dir = pC->esq; Rotação Esquerda! pC->esq = pB; pA->esq = pC->dir; pC->dir = pA; pA = pC;pA
pB
pC
Engenharia de Computação - Unipampa
Rotação Esquerda-Direita
01/02/2018 49A
B
T1
T2
T4
C
T3
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->esq; pC = pB->dir; pB->dir = pC->esq; Rotação Esquerda! pC->esq = pB; pA->esq = pC->dir; pC->dir = pA; pA = pC;pA
pB
pC
Rotação Esquerda-Direita
A
B
T1
C
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->esq; pC = pB->dir; pB->dir = pC->esq; Rotação Esquerda! pC->esq = pB; pA->esq = pC->dir; pC->dir = pA; pA = pC;pA
pB
pC
Engenharia de Computação - Unipampa
Rotação Esquerda-Direita
01/02/2018 51A
B
T1
T2
T4
C
T3
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->esq; pC = pB->dir; pB->dir = pC->esq; Rotação Esquerda! pC->esq = pB; pA->esq = pC->dir; pC->dir = pA; pA = pC;pB
pC
pA
Rotação Esquerda-Direita
42
15
88
27
6
+1
0
0
0
Incluir
34
42
15
88
27
6
+2
0
-1
-1
0
34
0
Engenharia de Computação - Unipampa
Rotação Esquerda-Direita
01/02/2018 5342
15
88
27
6
+2
0
-1
-1
0
34
0
Rotação Esquerda Direita0
PASSO 1
Rotação Esquerda
42
27
88
34
15
+2
0
+1
+1
6
0
Rotação Esquerda-Direita
Rotação Esquerda DiretaPASSO 2
Rotação Direita
42
27
88
34
15
+2
0
+1
+1
0
6
0
27
15
42
34
0
0
+1
0
6
0
88
0
Engenharia de Computação - Unipampa
Rotação Direita-Esquerda
01/02/2018 55• Toda vez que uma subárvore fica com um fator:
• negativo e sua subárvore da esquerda também tem um
fator positivo
ROTAÇÃO À DIREITA-ESQUERDA
130
200
150
-2
+1
0
Rotação Direita-Esquerda
DIREITA
120
100
130
200
150
80
110
ESQUERDA
120
100
130
150
200
80
110
120
100
150
Engenharia de Computação - Unipampa
Rotação Direita-Esquerda
01/02/2018 57A
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->dir; pC = pB->esq; pB->esq = pC->dir; Rotação Direita! pC->dir = pB; pA->dir = pC->esq; pC->esq = pA; pA = pC;pA
B
T1
T2
C
T3
T4
Rotação Direita-Esquerda
A
pA
B
T1
C
T4
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->dir; pC = pB->esq; pB->esq = pC->dir; Rotação Direita! pC->dir = pB; pA->dir = pC->esq; pC->esq = pA; pA = pC;pB
Engenharia de Computação - Unipampa
Rotação Direita-Esquerda
01/02/2018 59 Assumindo a e aux ponteiros para as subárvores com raiz A e B: pB = pA->dir; pC = pB->esq; pB->esq = pC->dir; Rotação Direita! pC->dir = pB; pA->dir = pC->esq; pC->esq = pA; pA = pC;A
pA
B
T1
T2
C
T3
T4
pB
pC
Rotação Direita-Esquerda
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B:pB = pA->dir; pC = pB->esq;
pB->esq = pC->dir; Rotação Direita! pC->dir = pB; pA->dir = pC->esq; pC->esq = pA; pA = pC;
A
pA
B
T1
C
T4
pB
pC
Engenharia de Computação - Unipampa
Rotação Direita-Esquerda
01/02/2018 61 Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->dir; pC = pB->esq; pB->esq = pC->dir; Rotação Direita! pC->dir = pB; pA->dir = pC->esq; pC->esq = pA; pA = pC;A
pA
B
T1
T2
C
T3
T4
pB
pC
Rotação Direita-Esquerda
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->dir; pC = pB->esq; pB->esq = pC->dir; Rotação Direita! pC->dir = pB; pA->dir = pC->esq; pC->esq = pA; pA = pC;A
pA
B
T1
C
pB
pC
Engenharia de Computação - Unipampa
Rotação Direita-Esquerda
01/02/2018 63 Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->dir; pC = pB->esq; pB->esq = pC->dir; Rotação Direita! pC->dir = pB; pA->dir = pC->esq; pC->esq = pA; pA = pC;A
pA
B
T1
T2
C
T3
T4
pB
pC
Rotação Direita-Esquerda
Assumindo pA, pB e pC ponteiros para as subárvores com raiz A e B: pB = pA->dir; pC = pB->esq; pB->esq = pC->dir; Rotação Direita! pC->dir = pB; pA->dir = pC->esq; pC->esq = pA; pA = pC;A
B
T1
C
pB
pC
pA
Engenharia de Computação - Unipampa
Rotações
01/02/2018 65
• Após uma rotação Direita ou Esquerda, os nós
A e B passam a ter fator de balanceamento
iguais a zero.
• No caso de rotações Esquerda-Direita e
Direita-Esquerda
• Os fatores de balanceamento dos nós A e B
podem ser recalculados com base no fator de
balanceamento do nó C.
• O novo fator de balanceamento do nó C passa a
ser zero.
Exercícios de fixação
• Realize as rotações necessárias:
40
30
50
55
45
20
25
30
26
15
17
12
Engenharia de Computação - Unipampa
Exercícios de fixação
01/02/2018 67
• Realize as rotações necessárias:
40
30
50
55
45
52
20
25
30
26
15
17
12
0
1
-2
-2
-1
Representação
• Vamos representar um nó AVL de forma similar
a um nó em uma árvore binária de busca,
contendo um campo adicionar altura que
manterá a altura de cada nó para o calculo do
fator de balanceamento:
Engenharia de Computação - Unipampa
Busca com Inserção
01/02/2018 69
• Para realizar as operações necessárias em cada nó
isolado é descrito a seguir um algoritmo recursivo.
• Por ser recursivo, é simples a incorporação de uma
operação adicional a ser executada no caminho de volta
ao longo do trajeto de busca.
• A cada passo é necessário saber se a altura da subárvore
em que foi feita a inserção cresceu ou não.
• Para tanto, serão utilizadas algumas funções auxiliares,
que calculam a altura da subárvore.
• O algoritmo de inserção deve ser chamado com o ponteiro
a como sendo a raiz da árvore.
Engenharia de Computação - Unipampa
Busca com Inserção
Busca com Inserção
• Funções auxiliares para realizar as rotações e
calculo da altura.
Engenharia de Computação - Unipampa
Busca com Inserção
01/02/2018 73
• Funções auxiliares para realizar as rotações e
calculo da altura.
Busca com Inserção
• Funções auxiliares para realizar as rotações e
calculo da altura.
Engenharia de Computação - Unipampa
Exemplo - Inserção
01/02/2018 75
Inserções
• Inserido x=7
• A inserção produz uma
árvore balanceada
Engenharia de Computação - Unipampa
Inserções
01/02/2018 77
• Inserido x=7
• A inserção produz uma
árvore balanceada, cujo
balanceamento envolve
uma rotação Esquerda
Inserções
Engenharia de Computação - Unipampa
Inserções
01/02/2018 79
Inserções
• Inserido x=2
• Inserir x=1
Engenharia de Computação - Unipampa
Inserções
01/02/2018 81• Inserido x=2
• Inserido x=1
• Ocorre
desbalanceamento da
subárvore de raiz 4...
Inserções
• Inserido x=2
• Inserido x=1
• Ocorre
desbalanceamento da
subárvore de raiz 4,
que é corrigido por
uma rotação Direita
Engenharia de Computação - Unipampa
Inserções
01/02/2018 83
Inserções
• Inserido x=3
• Ocorre desbalanceamento
da subárvore de raiz 5...
Engenharia de Computação - Unipampa
Inserções
01/02/2018 85• Inserido x=3
• Ocorre
desbalanceamento da
subárvore de raiz 5, que
é corrigido por uma
rotação
Esquerda-Direita
Inserções
Engenharia de Computação - Unipampa
Inserções
01/02/2018 87• Inserido x=3
• Ocorre desbalanceamento
da subárvore de raiz 5...
Inserções
• Inserido x=6
• Ocorre
desbalanceamento da
subárvore de raiz 5,
que é corrigido por uma
rotação
Engenharia de Computação - Unipampa
Inserção
01/02/2018 89
• INSERÇÃO A DIREITA
• Três casos distintos podem ocorrer:
• Caso 1:
h = 1 antes da inclusão
h -> 0, altura não se altera. Encerra.
• Caso 2:
h = 0 antes da inclusão
h -> -1, altura se altera, mas não provoca desbalanceamento.
Devem ser examinados os ancestrais do nó
• Caso 3:
h = -1 antes da inclusão
h -> -2, nodo fica desbalanceado. Aplicar a rotação adequada
e encerrar, pois a altura volta a ser igual à anterior.
Busca com Inserção
120
100
150
1
120
100
150
0
155
120
150
0
-1
Engenharia de Computação - Unipampa
Busca com Inserção
01/02/2018 91
• INSERÇÃO A ESQUERDA
• Três casos distintos podem ocorrer:
• Caso 1:
h = -1 antes da inclusão
h -> 0, altura não se altera. Encerra.
• Caso 2:
h = 0 antes da inclusão
h -> 1, altura se altera, mas não provoca desbalanceamento.
Devem ser examinados os ancestrais do nó
• Caso 3:
h = 1 antes da inclusão
h -> 2, nodo fica desbalanceado. Aplicar a rotação adequada
e encerrar, pois a altura volta a ser igual à anterior.
Busca com Inserção
120
100
150
-1
120
100
150
0
140
120
110
0
100
1
Engenharia de Computação - Unipampa
Remoção
Remoção
Engenharia de Computação - Unipampa
Remoção
Engenharia de Computação - Unipampa
Remoção
Remoção
Engenharia de Computação - Unipampa
Remoção
Engenharia de Computação - Unipampa
Remoção
Remoção
Engenharia de Computação - Unipampa
Remoção
Engenharia de Computação - Unipampa
Remoção
Remoção
Engenharia de Computação - Unipampa
Remoção
Remoção
Engenharia de Computação - Unipampa
Remoção
01/02/2018 109
• A remoção em árvores AVL é similar à remoção em
uma árvore binária de busca
• Todavia, é preciso verificar o balanceamento e, se
necessário, aplicar algumas das rotações.
• O algoritmo de remoção deve ser chamado com o
ponteiro a como sendo a raiz da árvore.
• As rotações aplicadas são ao contrário das utilizadas
na inserção:
• Quando inseria na esquerda as rotações eram Direita ou
Esquerda-Direita. Agora se excluo na direita as rotações são
Esquerda ou Direita-Esquerda.
Engenharia de Computação - Unipampa
Remoção
Engenharia de Computação - Unipampa
Remoção
01/02/2018 113
Exercícios de fixação
• Inserir em AVL, refazendo a árvore quando tiver
rotação e anotando as rotações realizadas. Na
inserção de quais elementos será necessário fazer
rotação?
50, 40, 30, 45, 47, 55, 56, 1, 2, 3
• Realize a inserção dos seguintes nodos fazendo as
devidas rotações quando necessárias:
Engenharia de Computação - Unipampa
Exercício de fixação -
Resposta
• Implemente a semipresencial 6
Engenharia de Computação - Unipampa
Referências
01/02/2018 117