Uma árvore AVL é uma árvore binária de busca (ABB) construída de tal modo que a altura de sua subárvore direita difere da altura da subárvore esquerda de no máximo 1.
Inserção AVL:
O que pode acontecer quando um novo nó é inserido numa árvore balanceada ?
Dada uma raiz r com subárvores L (left) e R (right), e supondo que a inserção deve ser feita na sub-árvore da esquerda. Podemos distriguir 3 casos:
É a altura da subárvore direita do nó menos a altura da subárvore esquerda do nó
Rebalanceamento:
Os problemas podem ser mapeados para dois casos:
Tipo 1: o nó raiz de uma subárvore tem FB 2 (ou
-2) e tem um filho com FB 1 (-1) o qual tem o mesmo sinal que o FB do nó
pai. Exemplos:
Exemplo 1:
Exemplo 2:
-> De
acordo com o demonstrado em sala de aula, fazer as rotações
adequadas para o re-balanceamento das árvores dos exemplos 1 e 2
acima.
procedure rotacao_direita (Var p:pno); Var q, temp: pno; begin q = esq(p); temp = dir(q); dir(q) = p; esq(p) = temp; end;
rotação_esquerda(p)
procedure rotacao_esquerda(Var p: pno;); Var q, temp: pno; begin q = dir(p); temp = esq(q); esq(q) = p; dir(p) = temp; end;
Tipo 2: o nó raiz de uma subárvore tem FB=2 (ou -2) e tem uma um filho com FB=-1 (1) o qual tem o sinal oposto ao FB do nó pai.
Exemplo: Caso (-2) (1)
FB do nó que contém 8: -2
FB do nó que contém 4: 1
Rotação de 8 à direita
-> Elaborar um caso (2) (-1) e executar o re-balanceamento.
-> Re-fazer os algoritmos de rotação
à esquerda e à direita, considerando o caso geral de re-balanceamento
de sub-árvores, utilizando a definição inicial
de árvora binária (tree).