Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Á
Á
rvores
rvores
Balanceadas
Balanceadas
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Á
Á
rvores Bin
rvores Bin
á
á
rias de Pesquisa
rias de Pesquisa
• Apresentam uma relação de ordem
• A ordem é definida pela chave
• Operações:
– inserir
– consultar
– excluir
500
300
800
150
400
600
900
Problemas com ABP
Problemas com ABP
Exemplo:
– Inserção: 10, 5, 15, 20, 25, 30, 35
– Inserção: 1, 13, 24, 27, 56
Problemas com ABP
Problemas com ABP
• Desbalanceamento progressivo
• Exemplo:
– inserção: 1, 13, 24, 27, 56
1
13
24
27
56
Alternativa de solução:
• Árvores balanceadas
• AVL
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Balanceamento de
Balanceamento de
Á
Á
rvores
rvores
• Distribuição equilibrada dos nós
– otimizar as operações de consulta
– diminuir o número médio de comparações
• Distribuição
– uniforme
– não uniforme
• chaves mais solicitadas mais perto da raiz
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Por Freq
Por Freq
ü
ü
ência
ência
• Por freqüência de acesso
– Pressupõe distribuição não uniforme de acessos
500
800
400
900
600
550
50%
12%
25%
4%
5%
4%
Balanceamento por distribuição
de acessos!
Uma árvore binária é
completamente balanceada
se a distância média dos nodos até a raiz for mínima
Á
Á
rvores balanceadas por ALTURA
rvores balanceadas por ALTURA
4%
4%
Por
Por
Freq
Freq
ü
ü
ência X Por Altura
ência X Por Altura
500
800
400
900
600
550
50%
12%
25%
4%
5%
4%
800
600
500
900
550
50%
50%
4%
5%
400
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Balanceamento por ALTURA
Balanceamento por ALTURA
220
120
80
100
300
150
260
400
110
130
200
250
270
350
140
Árvore não completamente balanceada
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Á
Á
rvores AVL
rvores AVL
Adelson-Velskii e Landis (1962)
Uma
á
á
rvore AVL
rvore AVL é uma árvore binária
de pesquisa (ABP) construída de tal
modo que a altura de sua subárvore
direita difere da altura da subárvore
esquerda de no
m
m
á
á
ximo 1.
ximo 1
Á
Árvores AVL
rvores AVL
•
•
árvores
FATOR(1)
são chamadas
Árvores AVL
¬ AVL
AVL
AVL
Adelson-Velskii e Landis (1962)
Á
Á
rvores balanceadas por altura
rvores balanceadas por altura
HB(k)-Tree
→
Height-Balanced k -Tree
•
•
árvore binária
•
•
para qualquer nodo, as alturas de suas duas
subárvores não diferem de mais do que k
unidades
•
•
cada uma das subárvores do nodo
apresenta a propriedade FATOR(k)
A
B
C
D
E
G
H
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Á
Á
rvores balanceadas por altura
rvores balanceadas por altura
HB(k)-Tree
→
Height-Balanced k -Tree
•
•
árvore binária
•
•
para qualquer nodo, as alturas de suas duas
subárvores não diferem de mais do que k
unidades
•
•
cada uma das subárvores do nodo
apresenta a propriedade FATOR(k)
A
B
C
D
E
G
H
I
J
Ex:
Ex:
verificar se a árvore ao lado é
FATOR(1)
FATOR(2)
FATOR(3)
→ Não
→ Não
→ Sim
+3
0
-2
0
-1
0
0
0
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Á
Á
rvores AVL
rvores AVL
•
•
árvores
FATOR(1)
são chamadas
Árvores AVL
Adelson-Velskii e Landis (1962)
Uma
á
á
rvore AVL
rvore AVL é uma árvore binária
de pesquisa (ABP) construída de tal
modo que a altura de sua subárvore
direita difere da altura da subárvore
esquerda de no
m
m
á
á
ximo 1.
ximo 1
Exerc
Exerc
í
í
cio:
cio:
Verifique quais das ABP são AVL:
130
150
100
200
120
80
110
120
130
100
200
110
80
150
Exerc
Exerc
ício: Resposta
í
cio: Resposta
Verifique quais das ABP são AVL:
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
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Exerc
Exerc
í
í
cio
cio
Verifique quais das ABP são AVL:
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
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Exerc
Exerc
ício: Resposta
í
cio: Resposta
Verifique quais das ABP são AVL:
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
AVL
Não AVL
Opera
Opera
ções
ç
ões
• por exemplo: INSERÇÃO
• deve ser preservada a propriedade AVL
Reestruturar
a árvore
Opera
Operaç
ções
ões
• Como manter uma árvore AVL sempre balanceada
após uma inserção ou exclusão?
• Através de uma operação de ROTAÇÃO
• Característica da operação
• preservar a ordem das chaves
• basta uma execução da operação de rotação para
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Balanceamento de
Balanceamento de
Á
Á
rvore AVL com Rota
rvore AVL com Rota
ç
ç
ão
ão
)
Rotação Dupla
• à direita
• à esquerda
)
Rotação Simples
• à direita
• à esquerda
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Simples
ão Simples
DIREITA
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
ROTA
Ç
Ç
ÃO SIMPLES
ÃO SIMPLES
À
À
DIREITA
DIREITA
Rota
Rota
ç
ç
ão Direita
ão Direita
120
110
150
100
80
130
200
Rota
Rota
ç
ç
ão Direita
ão Direita
120
110
150
100
80
130
200
+1
0
0
0
+2
+1
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Direita
ão Direita
120
110
150
100
80
130
200
+1
0
0
0
+2
+1
0
Rotação
Direita
?
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Direita
ão Direita
120
110
Rotação
Direita
150
100
80
130
200
120
100
150
80
110
130
200
+1
+2
+1
0
0
0
0
0
0
0
0
0
0
0
Balanceamento de
Balanceamento de
Á
Á
rvore AVL com Rota
rvore AVL com Rota
ç
ç
ão
ão
p
u
T1
T2
T3
Nó p é a raiz de transformação
T1, T2, T3 e T4 são subárvores
(vazias ou não)
)
Rotação Simples
• à direita
Rota
Rota
ç
ç
ão Direita
ão Direita
42
15
88
6
27
+1
0
0
0
0
Incluir 4
42
15
88
6
27
+2
0
+1
+1
0
4
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Direita
ã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!
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Direita
ão Direita
p
u
T1
T2
T3
u
p
T2
T3
T1
Rotação
Direita
Rota
Rota
ç
ç
ão Direita
ão Direita
p
u
T1
T2
T3
u
p
T2
T3
T1
Rotação
Direita
procedure rotacao_direita(var pt: pno);
var ptu: pno;
begin
ptu:= pt^.esq;
pt^.esq:= ptu^.dir;
ptu^.dir:= pt;
pt^.bal:= 0;
pt:= ptu;
end;
Rota
Rota
ç
ç
ão Simples
ão Simples
ESQUERDA
ESQUERDA
Toda vez que uma subárvore fica com um
fator:
• negativo e sua subárvore da direita
também tem um fator negativo
ROTA
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Esquerda
ão Esquerda
120
100
130
150
200
80
110
-1
0
0
0
0
-2
-1
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Esquerda
ão Esquerda
120
100
130
150
200
80
110
Rotação
Esquerda
?
-1
0
0
0
0
-2
-1
Rota
Rota
ç
ç
ão Esquerda
ão Esquerda
120
100
130
150
200
80
110
Rotação
Esquerda
120
100
150
80
110
130
200
Rota
Rota
ç
ç
ão Esquerda
ã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
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Esquerda
ão Esquerda
88
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!
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Esquerda
ão Esquerda
z
p
T1
T2
T3
p
z
T2
T3
T1
Rotação
Esquerda
Rota
Rota
ç
ç
ão Esquerda
ão Esquerda
z
p
T1
T2
T3
p
z
T2
T3
T1
Rotação
Esquerda
procedure rotacao_esquerda(var pt: pno);
var ptu: pno;
begin
ptu:= pt^.dir;
pt^.dir:= ptu^.esq;
ptu^.esq:= pt;
pt^.bal:= 0;
pt:= ptu;
end;
Rota
Rota
ç
ç
ão Dupla
ão Dupla
DIREITA
DIREITA
Toda vez que uma subárvore fica com um fator:
• positivo e sua subárvore da esquerda tem um fator
negativo
ROTA
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
120
110
150
80
100
130
200
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
+1
+2
-1
0
0
0
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
120
110
150
80
100
130
200
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
Rotação
Dupla
Direita
?
+1
+2
-1
0
0
0
0
DIREITA
ESQUERDA
120
110
150
80
100
130
200
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
120
110
150
100
80
130
200
120
100
150
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
p
u
T1
T2
T4
v
p
T3
T4
Rotação
Esquerda
v
T3
u
T1
T2
p
v
T3
T1
T4
u
T2
Rotação
Direita
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
p
u
T1
T2
T4
v
p
T3
T4
Rotação
Dupla
Direita
v
T3
u
T1
T2
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
procedure rotacao_esquerda_direita (var pt: pno);
var ptu, ptv: pno;
begin
ptu:= pt^.esq;
ptv:= ptu^.dir;
ptu^.dir:= ptv^.esq;
ptv^.esq:= ptu;
pt^.esq:= ptv^.dir;
ptv^.dir:= pt;
if ptv^.bal = -1
then pt^.bal:= 1
else pt^.bal:= 0;
if ptv^.bal = 1
then ptu^.bal:= -1;
else ptu^.bal:= 0;
pt:= ptv;
end;
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
42
15
88
27
6
+1
0
0
0
0
Incluir 34
42
15
88
27
6
+2
0
-1
-1
0
34
0
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
42
15
88
27
6
+2
0
-1
-1
0
34
0
Rotação
Dupla
Direita
0
PASSO 1
Rotação Esquerda
42
27
88
34
15
+2
0
+1
+1
6
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
Rotação
Dupla
Direita
PASSO 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
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Dupla
ão Dupla
ESQUERDA
ESQUERDA
Toda vez que uma subárvore fica com um fator:
• negativo e sua subárvore da direita tem um fator
positivo
ROTA
ROTA
Ç
Ç
ÃO DUPLA
ÃO DUPLA
À
À
ESQUERDA
ESQUERDA
120
100
130
200
150
80
110
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
-1
-2
+1
0
0
0
0
120
100
130
200
150
80
110
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
Rotação
Dupla
Esquerda
?
-1
-2
+1
0
0
0
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
DIREITA
120
100
130
200
150
80
110
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
ESQUERDA
120
100
130
150
200
80
110
120
100
150
80
110
130
200
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
120
100
130
200
150
80
110
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
Rotação
Dupla
Esquerda
120
100
150
80
110
130
200
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
p
z
T4
T2
T1
y
T3
ROTAÇÃO
DIREITA
p
y
T2
T2
T1
z
T3
y
z
T3
T4
p
T1
T2
ROTAÇÃO
ESQUERDA
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
p
z
T4
T2
T1
y
z
T3
T4
Rotação
Dupla
Esquerda
y
T3
p
T1
T2
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
procedure rotacao_direita_esquerda (var pt: pno);
var ptu, ptv: pno;
begin
ptu:= pt^.dir;
ptv:= ptu^.esq;
ptu^.esq:= ptv^.dir;
ptv^.dir:= ptu;
pt^.dir:= ptv^.esq;
ptv^.esq:= pt;
if ptv^.bal = 1
then pt^.bal:= -1
else pt^.bal:= 0;
if ptv^.bal = -1
then ptu^.bal:= 1;
else ptu^.bal:= 0;
pt:= ptv;
end;
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Exemplos de Rota
Exemplos de Rota
ç
ç
ão
ão
• Re-estruturar a árvore fazendo a rotação a partir do nó a
esquerda, imediato a raiz.
– Repetir o procedimento até que a árvore fique balanceada
• não precisa ser AVL
82
50
44
42
27
17
5
Exemplos de Rota
Exemplos de Rota
ç
ç
ão (Esquerda e Direita)
ão (Esquerda e Direita)
• Considere a árvore abaixo, no qual 12 está entre 9 e 15.
– Fazendo a rotação direita em 9, onde ficará 12?
– Terminada a rotação a direita, tente agora a rotação a esquerda
em 15.
15
9
22
4
12
Exemplos de Rota
Exemplos de Rota
ç
ç
ão (dentro da
ão (dentro da
á
á
rvore)
rvore)
• Considere a árvore abaixo:
– Execute a rotação em 15. O que acontece com o nó 42 (que é pai de 15)?
– Execute agora a operação oposta em 42. O que acontece com 15 (que é pai
de 42)?
50
23
42
17
30
43
15
6
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
• Mostre que a árvore abaixo pode ser completamente balanceada usando rotações
a direita e a esquerda.
• Vamos ver quem consegue estruturar a árvore com o caminho mais curto da raiz
até as folhas (altura da árvore)?
– Dica: uma abordagem é fazer o balanceamento sobre a raiz e recursivamente nas suas
subárvores.
82
100
50
42
27
107
98
140
120
166
44
17
5
2
12
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
http://www.cs.queensu.ca/home/jstewart/applets/bst/bst-rotation.html
Exemplos de Rota
Exemplos de Rota
ç
ç
ão
ão
Inser
Inser
ç
ç
ão
ão
de
de
Á
Á
rvores
rvores
AVL
AVL
220
120
80
100
300
150
260
400
110
130
200
250
270
350
500
Excluir 500
Inserir 140
Inser
Inser
ç
ç
ão
ão
de
de
Á
Á
rvores
rvores
AVL
AVL
220
120
80
100
300
150
260
400
110
130
200
250
270
350
140
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
AVL
AVL
•
•
árvores
FATOR(1)
são chamadas
Árvores AVL
Adelson-Velskii e Landis (1962)
Uma
á
á
rvore AVL é uma árvore binária
rvore AVL
de pesquisa (ABP) construída de tal
modo que a altura de sua subárvore
direita difere da altura da subárvore
esquerda de no
m
m
á
á
ximo 1.
ximo 1
[-1,1]
FATOR (1)
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
AVL
AVL
-
-
Rota
Rota
ç
ç
ões
ões
)
Rotação Dupla
• à direita
• raiz fator positivo
• subárvore fator negativo
• à esquerda
• raiz – fator negativo
• subárvore – fator positivo
)
Rotação Simples
• à direita
• raiz fator positivo
• subárvore fator positivo
• à esquerda
• raiz – fator negativo
• subárvore – fator negativo
Rota
Rota
ç
ç
ão Direita
ão Direita
120
110
Rotação
Direita
150
100
80
130
200
120
100
150
80
110
130
200
+1
+2
+1
0
0
0
0
0
0
0
0
0
0
0
Rota
Rota
ç
ç
ão Esquerda
ão Esquerda
120
100
130
150
200
80
110
Rotação
Esquerda
-1
0
0
0
0
-2
-1
120
100
150
80
110
130
200
0
0
0
0
0
0
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
120
110
150
80
100
130
200
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
Rotação
Dupla
Direita
?
+1
+2
-1
0
0
0
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
DIREITA
ESQUERDA
120
110
150
80
100
130
200
Rota
Rota
ç
ç
ão Dupla Direita
ão Dupla Direita
120
110
150
100
80
130
200
120
100
150
80
110
130
200
120
100
130
200
150
80
110
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
Rotação
Dupla
Esquerda
?
-1
-2
+1
0
0
0
0
DIREITA
120
100
130
200
150
80
110
Rota
Rota
ç
ç
ão Dupla Esquerda
ão Dupla Esquerda
ESQUERDA
120
100
130
150
200
80
110
120
100
150
80
110
130
200
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Exerc
Exerc
í
í
cios
cios
• Inserir em AVL, refazendo a árvore quando tiver
rotação e anotando as rotações realizadas:
–50, 40, 30, 45, 47, 55, 56, 1, 2, 3
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Inser
Inser
ç
ç
ão
ão
de nodo
de nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
Alguns Problemas
Alguns Problemas
• Percorre-se a árvore verificando se a chave já existe ou
não
– Em caso positivo, encerra a tentativa de inserção
– Caso contrário, a busca encontra o local correto de inserção do
novo nó
• Verifica-se se a inclusão tornará a árvore desbalanceada
– Em caso negativo, o processo termina
– Caso contrário, deve-se efetuar o balanceamento da árvore
• Descobre-se qual a operação de rotação a ser executada
• Executa-se a rotação
Inser
Inser
ç
ç
ão
ão
de nodo
de nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
• Como saber se a árvore está balanceada?
– Verificando se existe um nó “desregulado”
• Como saber se um nó está desregulado?
– Determina-se as alturas de suas sub-árvores e subtrai-se uma da
outra
• Procedimento muito lento!
• Como ser mais eficiente?
– Para cada nó v de uma árvore, armazena-se uma variável
balanço, onde
balanço(v) = altura(v
↑
.esq)- altura(v
↑
.dir)
Inser
Inser
ç
ç
ão
ão
de
de
nodo
nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
Alguns problemas...
Alguns problemas...
• Que valores são possíveis para balanço?
– -1, 0, 1
• De novo, como ser eficiente no cálculo do balanço?
– Dado q, como o nodo inserido.
– Se q pertencer à sub-árvore esquerda de v e essa inclusão
resultar em aumento na altura da sub-árvore, então
balanço(v) := balanço(v) + 1
• Se balanço(v) = 2, então v está desregulado
– Se q pertencer à sub-árvore direita de v e essa inclusão resultar
em aumento na altura da sub-árvore, então
balanço(v) := balanço(v) - 1
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Inser
Inser
ç
ç
ão
ão
de
de
nodo
nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
Alguns problemas...
Alguns problemas...
• Mas, quando é que a inclusão de q causa aumento
na altura da sub-árvore v?
• Suponha que q seja incluído na sub-árvore à
esquerda de v.
• Para q incluído na sub-árvore à direita,
considera-se o caso simétrico.
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Inser
Inser
ç
ç
ão
ão
de
de
nodo
nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
INSER
INSER
Ç
Ç
ÃO A DIREITA
ÃO A DIREITA
• Se, antes da inclusão:
–
–
Balan
Balan
ç
ç
o(v)= 1
o(v)= 1, então Balanço(v) se tornará 0
• altura da árvore não foi alterada
• Por consequência, altura dos outros nós no caminho até a raiz, não se altera
também.
–
–
Balan
Balan
ç
ç
o(v)= 0
o(v)= 0, então Balanço(v) se tornará -1
• altura da árvore foi modificada
• Por consequência, altura dos outros nós no caminho até a raiz, pode ter sido
alterada também.
• Repetir o processo (recursivamente), com v substituído por seu pai.
–
–
Balan
Balan
ç
ç
o(v)=
o(v)=
-
-
1
1, então Balanço(v) se tornará -2
• altura da árvore foi modificada e o nó está desregulado
• Rotação correta deve ser empregada.
• Como a árvore será redesenhada, não é necessário verificar os outros nós.
Inser
Inser
ç
ç
ão
ão
de nodo
de nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
INSER
INSER
Ç
Ç
ÃO A DIREITA
ÃO A DIREITA
120
100
150
1
Inser
Inser
ç
ç
ão
ão
de nodo
de nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
INSER
INSER
Ç
Ç
ÃO A DIREITA
ÃO A DIREITA
120
100
150
1
120
100
150
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Inser
Inser
ç
ç
ão
ão
de nodo
de nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
INSER
INSER
Ç
Ç
ÃO A DIREITA
ÃO A DIREITA
120
100
150
1
120
100
150
0
155
120
150
0
155
-1
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Inser
Inser
ç
ç
ão
ão
de
de
nodo
nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
INSER
INSER
Ç
Ç
ÃO A ESQUERDA
ÃO A ESQUERDA
• Se, antes da inclusão:
–
–
Balan
Balan
ç
ç
o(v)=
o(v)=
-
-
1
1, então Balanço(v) se tornará 0
• altura da árvore não foi alterada
• Por consequência, altura dos outros nós no caminho até a raiz, não se altera
também.
–
–
Balan
Balan
ç
ç
o(v)= 0
o(v)= 0, então Balanço(v) se tornará 1
• altura da árvore foi modificada
• Por consequência, altura dos outros nós no caminho até a raiz, pode ter sido
alterada também.
• Repetir o processo (recursivamente), com v substituído por seu pai.
–
–
Balan
Balan
ç
ç
o(v)= 1
o(v)= 1, então Balanço(v) se tornará 2
• altura da árvore foi modificada e o nó está desregulado
• Rotação correta deve ser empregada.
• Como a árvore será redesenhada, não é necessário verificar os outros nós.
Inser
Inser
ç
ç
ão
ão
de nodo
de nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
INSER
INSER
Ç
Ç
ÃO A ESQUERDA
ÃO A ESQUERDA
120
100
150
-1
Inser
Inser
ç
ç
ão
ão
de nodo
de nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
INSER
INSER
Ç
Ç
ÃO A ESQUERDA
ÃO A ESQUERDA
120
100
150
-1
120
100
150
0
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Inser
Inser
ç
ç
ão
ão
de nodo
de nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
INSER
INSER
Ç
Ç
ÃO A ESQUERDA
ÃO A ESQUERDA
120
100
150
-1
120
100
150
0
140
120
110
0
100
1
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Inser
Inser
ç
ç
ão
ão
de
de
nodo
nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
Proc InsereAVL (var a:Arvore; x:Info; ok:lógico);
{ Insere nodo em uma árvore AVL, onde A representa a raiz da árvore,
x, a chave a ser inserida e h a altura da árvore }
se a = nil
então início
InicioNo(a,x);
ok:=verdadeiro
fim;
senão
se x = a^.Info então pare
se x < a^.chave então início
InsereAVL(a^.esq,x,ok);
se ok então
caso a^.bal seja
1: a^.bal := 0; ok := falso;
0: a^.bal := -1;
-1: Caso1(a,ok); fim;
senão início
InsereAVL(a^.dir,x,ok);
se ok então
caso a^.bal seja
-1: a^.bal := 0; ok := falso;
0: a^.bal := 1
1: Caso2(a,ok); fim;
fim;
Inser
Inser
ç
ç
ão
ão
de
de
nodo
nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
Proc InícioNo (var a:Arvore, x:Info);
{ Aloca o novo nodo }
início
aloca(a);
a^.esq := nil;
a^.dir := nil;
a^.chave := x;
a^.bal := 0;
fim;
Inser
Inser
ç
ç
ão
ão
de
de
nodo
nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
Proc Caso1 (var a:Arvore, ok:lógico);
{ Faz balanceamento da árvore}
início
ptu = a^.esq;
se ptu^.bal = -1
então início
a^.esq := ptu^.dir; ptu^.dir := a;
a^.bal := 0;
a := ptu;
fim;
senão início
ptv := ptu^.dir;
ptu^.dir := ptv^.esq; ptv^.esq := ptu;
a^.esq := ptv^.dir; ptv^.dir := a;
se ptv^.bal = -1
então a^.bal := 1;
senão a^.bal := 0;
se ptv^.bal = 1
então ptu^.bal := -1;
senão ptu^.bal := 0;
a := ptv;
fim;
a^.bal := 0;
ok := falso;
fim;
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores
Inser
Inser
ç
ç
ão
ão
de
de
nodo
nodo
s
s
em
em
á
á
rvores AVL
rvores AVL
Proc Caso2 (var a:Arvore, ok:lógico);
{ Faz balanceamento da árvore}
início
ptu = a^.dir;
se ptu^.bal = 1
então início
a^.dir := ptu^.esq;
ptu^.esq := a;
a^.bal := 0;
a := ptu;
fim;
senão início
ptv := ptu^.esq;
ptu^.esq := ptv^.dir; ptv^.dir := ptu;
a^.dir := ptv^.esq; ptv^.esq := a;
se ptv^.bal = 1
então a^.bal := -1;
senão a^.bal := 0;
se ptv^.bal = -1
então ptu^.bal := 1;
senão ptu^.bal := 0;
a := ptv;
fim;
a^.bal := 0;
ok := falso;
fim;
Renata de Matos Galante, Clesio S. Santos, Nina Edelweiss e Luciana P. Nedel Estruturas de Dados - Àrvores