Árvores AVL (Balanceadas)

Propaganda
SCE 182SCC122
– Algoritmos
e Estruturas
de Dados I
– Estruturas
de Dados
Árvores AVL (Balanceadas)
Profª.Drª. Roseli Ap. Francelin Romero
Fonte: Profa. Patrícia Marchetti
Revisão: Gedson Faria
Árvores AVL – (Balanceadas) Definição
A altura de uma árvore binária é o nível
máximo de suas folhas (profundidade)
Uma árvore binária balanceada (AVL) é uma
árvore binária na qual as alturas das duas
subárvores de todo nó nunca difere em mais
de 1.
O balanceamento de um NÓ é definido como
a altura de sua subárvore esquerda menos a
altura de sua subárvore direita.
Roseli A. F. Romero
Árvores AVL – (Balanceadas) Definição
Cada nó numa árvore binária
balanceada (AVL) tem balanceamento
de 1, -1 ou 0.
Se o valor do balanceamento do nó for
diferente de 1, -1 e 0. Essa árvore não
é balanceada (AVL).
Observe o exemplo a seguir:
Roseli A. F. Romero
Árvores AVL (Balanceada) – Exemplo
-1
0
1
0
0
1
0
-1
0
0
0
0
0
0
0
0
0
Roseli A. F. Romero
Árvores AVL – (Balanceadas)
Se a probabilidade de pesquisar um
dado for a mesma para todos os dados,
uma árvore binária balanceada
determinará a busca mais eficiente.
Mas os algoritmos de inserção e
remoção já vistos até agora não
garantem que essa árvore permanecerá
balanceada.
Roseli A. F. Romero
Árvores AVL (Balanceada) – Exemplo
B – inserções
que mantêm
a árvore
balanceada.
B B
U1 U2
U3 U4
Un – inserções não
balanceadas.
B BB B
U5 U6 U7 U8
U9 U10
U11 U12
Roseli A. F. Romero
Árvores Balanceadas - AVL
O desbalanceamento ocorre quando:
O NÓ é inserido é um descendente
esquerdo de um nó que tinha
balanceamento de 1 (U1 até U8)
OU
Se ele for um descendente direito de um
nó que tinha balanceamento de –1 (U9
até U12).
Roseli A. F. Romero
Árvores AVL (Balanceadas)
Para manter uma árvore balanceada, é
necessário fazer uma transformação na
árvore tal que:
1. o percurso em ordem da árvore
transformada seja o mesmo da árvore
original (isto é, a árvore transformada
continue sendo um árvore de busca
binária);
2. a árvore transformada fique
balanceada.
Roseli A. F. Romero
Árvores AVL (Balanceadas)
A transformação a ser feita na árvore tal que
ela se mantenha balanceada é chamada de
rotação.
A rotação poderá ser feita à esquerda ou à
direita dependendo do desbalanceamento que
tiver que ser solucionado.
A rotação deve ser realizada de maneira que
as regras 1 e 2 da transp. Anterior sejam
respeitadas.
Dependendo do desbalanceamento a ser
solucionado, apenas uma rotação não será
suficiente para resolvê-lo.
Roseli A. F. Romero
Árvores AVL – Rotação DIREITA
Percurso
A
em Ordem:
C
B
RHDIBEANJ
OFKCLGPMQ
D
H
E
F
I
J
R
DESBALANCEOU!
N
SOLUÇÃO:
G
K
O
L
M
P
Q
ROTAÇÃO DIREITA
Roseli A. F. Romero
Árvores AVL – Rotação DIREITA
Percurso
A
em Ordem:
C RHDIBEANJ
D
B
H
R
OFKCLGPMQ
I
ROTAÇÃO DIREITA
CONCLUÍDA
F
E
J
N
G
K
O
L
M
P
Q
ÁRVORE ESTÁ NOVAMENTE BALANCEADA!!!
Roseli A. F. Romero
Árvores AVL – Rotação ESQUERDA
A
Percurso
C
em Ordem:
B
HDIBEAJFRN
KOCLGPMQ
D
H
E
F
I
J
G
K
L
M
DESBALANCEOU!
N
ROTAÇÃO ESQUERDA
O
P
Q
R
Roseli A. F. Romero
Árvores AVL (Balanceadas)
Nos 2 exemplos anteriores de rotação a
esquerda e a direita as duas regras
foram mantidas:
o percurso em ordem da árvore
transformada deve ser o mesmo da
árvore original (isto é, a árvore
transformada continue sendo um árvore
de busca binária);
a árvore transformada continua
balanceada.
Roseli A. F. Romero
Árvores AVL (Balanceadas)
Para o rebalanceamento da árvore é
necessário calcular o Fator de Balanceamento
para verificar qual rotação deve ser efetuada
afim de rebalanceá-la.
FB = h da subárvore direita - h da subárvore
esquerda
Se FB é negativo, as rotações são feitas à
direita
Se FB é positivo, as rotações são feitas à
esquerda
Roseli A. F. Romero
Árvores AVL (Balanceadas)
Há dois tipos de ocorrências nos casos
de balanceamento:
Caso1: Nó raiz com FB 2 ou –2 com um
filho (na direção de onde houve a
inserção) com FB 1 ou –1 com o mesmo
sinal, neste caso a solução é uma
rotação simples.
Roseli A. F. Romero
Árvores AVL (Balanceadas)
FB(raiz)= Hd - He
4 - 2 = 2
FB(10)= Hd – He
3 - 2 = 1
8
4
10
15
9
Solução: rotação à esquerda
do nó 8, ou raiz.
12
inserido
RoseliNó
A. F.
Romero
Árvores AVL (Balanceadas)
Solução: rotação à esquerda
do nó 8, ou raiz.
10
8
4
15
9
12
Nó inserido
Roseli A. F. Romero
Árvores AVL (Balanceadas)
Caso 2: Nó raiz com FB 2 ou –2 com um filho
(na direção de onde houve a inserção) com FB
-1 ou 1 os quais possuem sinais trocados,
neste caso a solução é uma rotação dupla.
Primeiro rotaciona-se o nó com fator de
balanceamento 1 ou –1 na direção apropriada
e depois rotaciona-se o nó cujo fator de
balanceamento seja 2 ou –2 na direção oposta
Roseli A. F. Romero
Árvores AVL (Balanceadas)
FB(raiz)=
8
4
2 -
10
5
FB(4)=
2
6
2
4 = -2
-
1 = 1
Solução: rotação do nó 4 à esquerda
Rotação do nó 8 à direita.
Nó inserido
Roseli A. F. Romero
Árvores AVL (Balanceadas)
Solução: rotação do nó 4 à esquerda
Rotação do nó 8 à direita.
8
4
10
8
6
2
6
5
10
6
4
Nó inserido
2
8
4
5
2
5
10
Roseli A. F. Romero
Árvores AVL (Balanceadas)
p
Algoritmo de Rotação à direita:
void rot_dir(NODEPTR p){
NODEPTR q, temp;
q = p->esq;
temp = q->dir;
q->dir = p;
p->esq = temp;
p = q;
}
2
8
q
4
10
6
2
5
temp
p
4
8
5 6
10
Roseli A. F. Romero
Árvores AVL (Balanceadas)
p
Algoritmo de Rotação à esquerda:
void rot_esq(NODEPTR p){
NODEPTR q, temp;
q = p->dir;
temp = q->esq;
q->esq = p;
p->dir = temp;
p = q;
}
2
8
q
15
2
9
temp
20
17
p
15
20
8
9 17
Roseli A. F. Romero
Árvores AVL (Balanceadas)
p
Algoritmo de Rotação a direita no caso 2:
void rot_esq_dir(NODEPTR p){
rot_esq(p->esq);
rot_dir(p);
}
8
4
10
6
2
5
Roseli A. F. Romero
Árvores AVL (Balanceadas)
Algoritmo de Rotação à esquerda no caso 2:
void rot_dir_esq(NODEPTR p){
rot_dir(p->dir);
rot_esq(p);
}
p
8
15
2
9
20
17
Roseli A. F. Romero
Download