• Árvores binárias de busca organizam os dados com o objetivo de otimizar as buscas
• Permite o acesso mais rápido aos elementos:
– Elementos menores que a raiz estão na esquerda – Elementos maiores que a raiz estão na direita
• Estas árvore podem assumir diferentes formas quando criadas ou modificadas
– A ordem de inserção ou remoção influem no formato da árvore
– Pode afetar o tempo necessário para recuperar um item armazenado
• Ordem de Inserção: 2 , 3, 4, 7, 8
2
• Ordem de Inserção: 2 , 3 , 4, 7, 8
2
3
• Ordem de Inserção: 2 , 3 , 4 , 7, 8
2
3
4
• Ordem de Inserção: 2 , 3 , 4 , 7 , 8
2
3
4
7
• Ordem de Inserção: 2 , 3 , 4 , 7 , 8
2
3
4
8 7
Estrutura de uma Lista.
Árvore Degenerada
(zigue-zague)
• Cada nó tem graus 0 ou 2
• Ou um nó é folha ou tem 2 filhos
1
2 3
4 5
6 7 8 9
• Toda folha está ou no último ou no penúltimo nível da árvore
A
B C
F G
H I
D E
• Árvore estritamente binária em que toda folha se localizar no último nível
A
B C
F G
N O
D E
L M
J K
H I
• A denominação AVL vem dos seus dois criadores: A del’son- V el’skii e L andis
• Uma árvore binária de busca é AVL se:
– Para todos os seus nós, as alturas de suas duas subárvores diferem no máximo de uma unidade
• Em árvores AVL as operações de inserção e remoção devem atualizar o balanceamento
– Utiliza-se o fator de balanceamento (FB)
• Como saber se a árvore está desbalanceada?
– Verificando se existe algum nó desbalanceado
• Como saber se um nó está desbalanceado ?
– Subtraindo-se as alturas das suas subárvores
• Fator de Balanceamento
– Obtido pela subtração da altura da subárvore
esquerda (he) e da altura da subárvore direita (hd) – FB = he – hd
• O FB dos nós Internos será a subtração da
altura de suas subárvores (folhas tem FB = 0)
• Dividida em duas etapas
– Inserção de elementos é da mesma maneira como acontece nas árvores binárias de buscas
– Verificar se a árvore resultante é ou não AVL (tratando o fator de balanceamento)
– Para cada novo nó inserido, seu fator de balanceamento é iniciado com 0 (zero)
– Após a inserção é necessário atualizar o FB dos ancestrais do nó inserido
• A busca é exatamente a mesma
– Toda AVL é uma árvore binária de busca
• A remoção em uma árvore AVL é exatamente igual à da árvores binárias de busca
– Porém, é preciso atualizar o fator de balanceamento
• Cada nó em uma árvore binária balanceada (AVL) deve ter balanceamento: -1, 0 ou +1
> 0 se a subárvore da esquerda for maior
0 se ambas as subárvores forem do mesmo tamanho
< 0 se a subárvore da direita for maior
• Um nó com FB superior ou inferior a estes
valores é considerado desbalanceado
2
1 3
4 5
1. Definir fb = 0 para os nós folhas.
1. Definir fb = 0 para os nós folhas.
0
0 0
1. Definir fb = 0 para os nós folhas.
2. Calcular o fb:
• he – hd 1 - 2
0
0 0
1. Definir fb = 0 para os nós folhas.
2. Calcular o fb:
• he – hd
0
0 0
-1
1. Definir fb = 0 para os nós folhas.
2. Calcular o fb:
• he – hd 1 - 1
0
0 0
-1
• Balanceada (É AVL)
1. Definir fb = 0 para os nós folhas.
2. Calcular o fb:
• he – hd
0 0
0 0
-1
2
1 3
5
8
1. Definir fb = 0 para os nós folhas.
0
0
1. Definir fb = 0 para os nós folhas.
0
0
1. Definir fb = 0 para os nós folhas.
2. Calcular o fb:
• he – hd 1 - 3
0
0
-2 1. Definir fb = 0 para os nós
folhas.
2. Calcular o fb:
• he – hd
0
0
-2 1. Definir fb = 0 para os nós
folhas.
2. Calcular o fb:
• he – hd 0 - 2
0
0 -2
-2
1. Definir fb = 0 para os nós folhas.
2. Calcular o fb:
• he – hd
0
0 -2
-2
1. Definir fb = 0 para os nós folhas.
2. Calcular o fb:
• he – hd 0 - 1
• Desbalanceada (Não é AVL)
0
0 -2
-2
1. Definir fb = 0 para os nós folhas.
2. Calcular o fb:
• he – hd
-1
• O desbalanceamento ocorre quando
– O nó inserido é descendente esquerdo de uma subárvore cujo nó raiz tenha FB igual 1
1. Cenário:
42 31
22
8
5
42 31
22
8
2. Cenário:
• O desbalanceamento ocorre quando
– O nó inserido é descendente direito de uma subárvore cujo nó raiz tenha FB igual –1
1. Cenário:
10
20
30
35
44 10
20
30
35
2. Cenário:
• Para manter uma árvore balanceada, é
necessário fazer uma transformação na árvore
– A árvore continua sendo um árvore de busca binária
• A transformação a ser feita na árvore para mantê-la balanceada é chamada de rotação
– A rotação poderá ser feita à esquerda ou à direita dependendo do desbalanceamento
– Dependendo do desbalanceamento, apenas uma rotação não é suficiente para resolvê-lo
• Existem 4 tipos de rotações para rebalancear uma árvore AVL
– Rotação simples à Direita;
– Rotação simples à Esquerda;
– Rotação dupla à Direita (Direita + esquerda); e – Rotação dupla à Esquerda (Esquerda + direita).
• Se o FB é positivo, então as rotações são feitas à direita, caso contrário, são feitas à esquerda
• A rotação deve iniciar a partir do nó interno
mais desbalanceado
• Passo 1
– Identificar o nó (+ interno) cujo fb é igual à +2
• Passo 2
– Fazer com que o nó à esquerda do nó detectado no passo 1 vire a raiz
• Passo 3
– Se o novo nó raiz tiver uma subárvore a direita, então essa subárvore passa a ser a subárvore a esquerda da antiga raiz
– Caso contrário, finaliza a execução do algoritmo
• Passo 1
T1
T2
T3 U
P P
• Passo 2
T1
T2
T3 U
P
T1
U
T2
T3 P
• Passo 2
T1
T2
T3 U
P
T1
U
T3 P
• Passo 3
T1
T2
T3 U
P
T1
U
T2 T3
P
• Exemplo 1
30 20
10
U
P
• Exemplo 1
30 20
10 30
20
10
U
P
• Exemplo 2
30
20
25 10
U
P
• Exemplo 2
25 20
30 10
30
20
25 10
U
P
• Exemplo 3
U
P
5
42 31
22
8
• Exemplo 3
8
22 5
U
P
5
42 31
22
8
42 31
• Exemplo 4
I
E B
A D
G
F H
K
J L
C
T1 T2
U T3
P
• Exemplo 4
E B
A D
C
I G
F H
K
J L
T1
T2
T3 U
P
• Passo 1
– Identificar o nó (+ interno) cujo fb é igual à -2
• Passo 2
– Fazer com que o nó à direita do nó detectado no passo 1 vire a raiz
• Passo 3
– Se o novo nó raiz tiver uma subárvore a esquerda, então essa subárvore passa a ser a subárvore a
direita da antiga raiz
– Caso contrário, finaliza a execução do algoritmo
• Passo 1
T3 T2
T1
Z P
Z P
• Passo 2
T3 T2
T1
Z P
T3 T2
T1
Z
P
• Passo 2
T3 T2
T1
Z P
T3 T1
Z
P
• Passo 3
T3 T2
T1
Z P
T3 T1 T2
Z
P
• Exemplo 1
10
20
30
Z P
• Exemplo 1
30 20
10 10
20
30
Z P
• Exemplo 2
10
20
15 30
Z P
• Exemplo 2
10
20
15 30 15
20
10 30
Z P
• Exemplo 3
Z P
44 10
20
30
35
• Exemplo 3
Z P
44 10
20
30
35
35
30 44
10
20
• Exemplo 4
T1
T2
T3 8 Z
4 10
9 15
12 P
• Exemplo 4
10
8 15
9 12
4
Z
P
T1 T2
T3
• Passo 1
– Identificar o nó (+ interno) cujo fb é igual à +2
– Verificar se o fb do nó à esquerda do nó detectado no passo 1 é negativo
• Passo 2
– Fazer uma rotação à esquerda na subárvore da esquerda
• Passo 3
– Fazer uma rotação à direita na “árvore original”
• Exemplo usando rotação simples à direita
20
10
15
10
20
15 2
-1
0
• Exemplo usando rotação dupla à direita
20 15
10
1º.
20
15
10
2º. 3º.
20
10
15
2
-1
0
• Passo 1
8
10 4
6 2
5
2
0 -1
1 0
0
Fator de balanceamento
• Passo 2
8
4 10
6 2
5 4
• Passo 2
8
10 6
4
5 2
• Passo 3
8
10 6
4
5 2
8
• Passo 3
6
8 4
5
2 10
• Passo 1
– Identificar o nó (+ interno) cujo fb é igual à -2
– Verificar se o fb do nó à direita do nó detectado no passo 1 é positivo
• Passo 2
– Fazer uma rotação à direita na subárvore da direita
• Passo 3
– Fazer uma rotação à esquerda na “árvore original”
• Exemplo
10
20
15
-2
1
0 20
15
10
1º.
10
15
20
2º. 3º.