Uma árvore AVL é uma árvore binária de busca balanceada onde a diferença entre as alturas das subárvores esquerda e direita de cada nó é no máximo 1. Isso garante que as operações de busca, inserção e remoção ocorram em tempo logarítmico. Quando uma inserção ou remoção causa desequilíbrio, rotações simples ou duplas são aplicadas para restaurar o balanceamento.
2. Uma árvore é considerada AVL se, e somente
se, para cada um de seus nós, as alturas das
sub-árvores à direita e à esquerda forem iguais,
ou difiram em apenas uma unidade.
5. 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 desbalanceada 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.
Devemos sempre tentar manter o custo de acesso o menor
possível, e o algoritmo da árvore avl busca exatamente isso,
deixando a árvore sempre com a menor altura possível.
6. 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 desbalanceada 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.
Devemos sempre tentar manter o custo de acesso o menor
possível, e o algoritmo da árvore AVL busca exatamente isso,
deixando a árvore sempre com a menor altura possível.
7. Para cada nó, defini-se um fator de balanceamento
(FatBal), que deve ser -1, 0 ou 1. Ele é o responsável
por avisar que a árvore está desbalanceada.
FatBal = altura (sub-árvore 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.
Toda folha tem FB = 0
8. Quando inserimos um novo registro na árvore, ou removemos um
registro já existente.
Esta inserção/remoção pode ou não alterar as propriedades de
balanceamento.
Caso a inserção/remoção desse novo registro não viole nenhuma
propriedade de balanceamento, podemos continuar
inserindo/removendo registros.
Se a inserção/remoção afetar as propriedades de balanceamento,
devemos restaurar o balanço da árvore. Esta restauração é
efetuada através de Rotações na árvore.
11. Rotação dupla à esquerda
(rotação simples à direita + rotação simples à esquerda)
12. Rotação dupla à direita
(rotação simples à esquerda + rotação simples à direita)
13. Dicas
a) Para identificar quando uma rotação é simples ou
dupla deve-se observar os sinais do FB:
- Se o sinal for igual, a rotação é simples
- Se o sinal for diferente, a rotação é dupla
b) Se FB for positivo (+), a rotação é para à esquerda
c) Se FB for negativo (-), a rotação é para à direita
14. Suponha que inserimos os números 50, 40 e 30 em
uma árvore. Obteremos então:
A inserção 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 nó com FB -2.
No caso simétrico (nó com FB 2) faríamos
uma rotação simples à esquerda.
15. Após a rotação simples teremos:
Agora a árvore está balanceada.
16. Como podemos observar, a árvore está balanceada
pelos FB de cada nó.
São dois os possíveis casos de desbalanceamento.
17. Ao inserir o número 5 na árvore, teremos a seguinte
árvore:
O nó 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 nó com FB 1 para a esquerda.
18. Logo rotaciona-se o nó que possuía FB -2 na direção
oposta, nesse caso a direita.
19. Os FB dos nós 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 nó com FB +2 com um filho com FB -1. Também
utilizaríamos uma rotação dupla, mas nos sentidos contrários, ou seja, o
nó com FB -1 seria rotacionado para a direita e o nó com FB +2 seria
rotacionado para a esquerda.