Árvores AVL - Paulo Roberto Gomes Luzzardi

Propaganda
Árvores AVL
Balanceadas
(Árvore Binária Balanceada)
José Antonio de Oliveira Neto
[email protected]
SUMÁRIO
•
•
•
•
•
•
•
•
•
O que são árvores?
Árvores Balanceadas
Balanceamento estático e dinâmico!
Árvores AVL
Fator de Balanceamento (Fatbal)
Rotação Simples(Esquerda e direita)
Rotação Dupla (Esquerda e Direita)
Exemplos
Referências.
O que são Árvores?
• São estruturas de dados não lineares que
caracterizam uma relação entre dados;
• A relação existente entre os dados é uma
relação de hierarquia onde um conjunto de
nodos é hierarquicamente subordinado a outro.
Árvores
Balanceadas
• Uma arvore é considerada balanceada quando suas
sub-arvores à esquerda e à direita possuem a mesma
altura.
• A árvore não balanceada é definida como degenerada
Árvore Binária Balanceada
Árvore Binária Degenerada
Árvores
Balanceadas
• Balanceamento Estático:
- Este balanceamento consiste em, depois de um certo
tempo de uso da árvore, destruir sua estrutura,
guardando suas informações em uma lista ordenada e
reconstruí-la de forma balanceada.
• Balanceamento Dinâmico:
- Tem por objetivo reajustar os nós de uma árvore
sempre que uma inserção ou remoção provocar
desbalanceamento.
- Um exemplo de Balanceamento dinâmico são as
árvores AVL.
Árvores AVL
• O termo AVL vem de seus fundadores Adel´son, Vel´skii
e Landis (1962). Foi a primeira estrutura de dados a
oferecer operações de inserção, remoção e busca em
tempo logaritmo ou seja é um algoritmo muito rápido.
-
Em uma árvore degenerada de 10.000 nós, são necessárias 5.000 comparações para efetuar
uma busca, já numa árvore AVL, com o mesmo número de nós, essa média baixa para 14
comparações.
–
• A árvore AVL é uma árvore binária de busca e sua
estrutura foi construída de forma que a altura da subárvore direita é diferente da altura da sub-árvore
esquerda de no máximo 1.
Árvores AVL
Fator de Balanceamento
• Sendo assim, para cada nó define-se um
fator de balanceamento(fatbal), que deve
ser -1,0 ou 1.
Fatbal = altura (sub-arvore direita) – altura (sub-árvore esquerda)
-> Fatbal = -1, quando a sub-árvore da esquerda é um nível mais alto
que a direita.
-> Fatbal = 0, quando as duas sub-árvores tem a mesma altura.
-> Fatbal = 1, quando a sub-árvore da direita é um nível mais alto que
a esquerda.
Balanceamento em AVL
• Inserimos um novo nodo na árvore.
• Esta inserção pode ou não alterar as propriedades de
balanceamento.
• Caso a inserção desse novo nodo não viole alguma
propriedade de balanceamento, podemos continuar
inserindo novos nodos.
• Se a inserção afetar as propriedades de balanceamento
devemos restaurar o balanço da árvore. Esta
restauração é efetuada através de ROTAÇÕES na
árvore.
Rotação:
I) Rotação simples à esquerda
Rotação:
II) Rotação simples à direita
Rotação:
III) Rotação dupla à esquerda
(rotação simples à direita + rotação simples à esquerda)
Rotação:
IV) Rotação dupla à direita
(rotação simples à esquerda + rotação simples à direita)
Rotação:
Dicas:
a) Para identificar quando uma rotação é simples
ou dupla deve-se observar os sinais do Fb:
• Sinal for igual, a rotação é simples
• Sinal for diferente a rotação é dupla
b) Se Fb for positivo (+) a rotação para à esquerda
c) Se Fb for negativa (-) a rotação para à direita
Caso I: Rotação Simples
• Suponha que inserimos os números 50, 40 e 30 em uma
árvore. Obteremos então:
•
A inserção novamente produziu um desbalanceamento.
•
Neste caso, como os sinais dos FB são os mesmos, significa que precisamos fazer apenas
uma ROTAÇÃO SIMPLES à direita no nodo com FB -2.
•
No caso simétrico (nodo com FB 2) faríamos uma rotação simples à esquerda.
Caso I: Rotação Simples
•
Após a rotação simples teremos:
• A árvore está balanceada dentro das propriedades de AVL.
Exemplo:
• Considerando a árvore abaixo:
•
•
A árvore está balanceada, como podemos observar pelos Fb de cada nodo.
São dois os possíveis casos de desbalancemento
Caso II: Rotação Dupla
• Ao inserir o número 5 na árvore teremos a seguinte
árvore:
•
•
O nodo 8 fica com o FB -2 e tem um filho com FB +1. Neste caso para manter o balanceamento
devemos aplicar duas rotações, também denominada ROTAÇÃO DUPLA.
Primeiro rotaciona-se o nodo com FB 1 para a esquerda.
Caso II: Rotação Dupla
• Logo rotaciona-se o nodo que possuía FB -2 na direção
oposta, nesse caso a direita.
Caso II: Rotação Dupla
•
Os FB dos nodos voltaram a ficar dentro do esperado das árvores AVL.
•
O caso simétrico ao explicado acima acontece com os sinais de FB
trocados, ou seja, um nodo com FB +2 com um filho com FB -1. Também
utilizariamos uma rotação dupla, mas nos sentidos contrários, ou seja, o
nodo com FB -1 seria rotacionado para a direita e o nodo com FB +2 seria
rotacionado para a esquerda.
• A descrição do algoritmo em pseudo-código para
a construção de uma árvore AVL seria:
– Inserir o novo nodo normalmente
– Iniciando com o nodo pai do nodo recém-inserido, testar se a propriedade
AVL é violada no novo nodo. Temos aqui 2 possibilidades:
– A condição AVL foi violada
• Execute as operações de rotação conforme for o caso (Caso I ou Caso
II).
• Volte ao passo de Inserção.
– A condição AVL não foi violada.
– Se o nodo recém-testado não tem pai, ou seja, é o nodo raiz da árvore,
volte para inserir novo nodo.
Referências:
• Luzzardi, Paulo Roberto Gomes -Estrutura da
Dados. UCPel
• Sites:
* http://www.ucb.br/prg/professores/giovanni/disciplinas/20051/eda/material/avl.html
* http://www.ufgd.edu.br/~wlsantos/Algo/Arvores_Topicos.pdf
* http://www.ufgd.edu.br/~wlsantos/Algo/Arvores.pdf
*http://virtual.lncc.br/~rodrigo/cursos/unused/EDII/01_Apostilas/outros/AVL
_IME.pdf
Simulação:
*
http://www.site.uottawa.ca/~stan/csi2514/applets/avl/BT.html
Download