E
STRUTURASDED
ADOS EA
LGORITMOSÁ
RVOREB
ALANCEADAAVL
Adalberto CajueiroDepartamento de Sistemas e Computação Universidade Federal de Campina Grande 1
ÁRVORE BINÁRIA
Qual o tempo das operações de inserção e busca
em uma BST?
O que acontece quando uma BST possui uma
topologia que
“
pesa
”
muito para um dos lados?
Seria possível uma árvore se reorganizar
dinamicamente para garantir operacoes em
tempo O(log n)?
6 2 1
8 6
2
ÁRVORE BINÁRIA BALANCEADA (AVL)
Origem:
A
delson-
V
elskii, G.; E. M.
L
andis (1962).
"
An algorithm for the organization of
information
".
Proceedings of the USSR
Academy of Sciences
146: 263
–
266. (Russian)
English translation by Myron J. Ricci in
Soviet Math. Doklady
, 3:1259
–
1263, 1962.
AVL (Adelson-Velskii e Landis)
3
ÁRVORE BINÁRIA BALANCEADA (AVL)
É uma árvore binária de busca (BST) cujo
objetivo é remover o problema do pior caso
onde a altura é O(n).
Uso de invariante:
Balanceamento: a altura das sub-árvores
diferem no máximo em 1.
EXEMPLO
altura
5
EXERCÍCIO
Quais destas árvores são AVL?
42
88 15
94
6 63
71 57 27
20
42
88 15
63
71 57 27
20 42
EXERCÍCIO
Quais destas árvores são AVL?
7 42
88 15
94
6 63
71 57 27 20 Árvore AVL 42 88 15 63 71 57 27 20
Não é árvore AVL!
42
88 28
94 6 27 63
Não é árvore AVL!
ÁRVORE BINÁRIA BALANCEADA (AVL)
Buscas, insercoes e remocoes possuem
complexidade O(log n).
Insercoes e remocoes podem requerer o
rebalanceamento
da árvore.
O fator de balanceamento é dado pela diferença:
height(left)-height(right)
e indica para onde a
árvore pesa:
-1: a árvore pesa para a direita
0: nao pesa pra nenhum lado
1 a arvore pesa para a esquerda
Operacoes de rotação reajustam a arvore.
ÁRVORE BINÁRIA BALANCEADA (AVL)
A busca realizada em uma árvore AVL é
igual
a
realizada em uma
árvore binária de busca
9
ALTURA: TEOREMA
A altura de uma árvore AVL com N nós internos
sempre está entre:
ÁRVORE BINÁRIA BALANCEADA (AVL)
Inserçoes
As insercoes funcionam exatamente como na árvore binaria de busca
Entretanto
…
Insercoes podem desbalancear a árvore!
Como resolver?
Usando operações de rotacao
O fator de balanceamento diz quando aplicar rotação
11
ÁRVORE BINÁRIA BALANCEADA (AVL)
Rotação
Operação sobre arvores binarias que muda as estruturas sem interferir na ordem dos elementos.
Move um nó pra cima e um nó para baixo
Quais os efeitos imediatos de uma rotação?
ÁRVORE BINÁRIA BALANCEADA (AVL)
Rotação
Operação sobre arvores binarias que muda as estruturas sem interferir na ordem dos elementos.
Move um nó pra cima e um nó para baixo
Quais os efeitos imediatos de uma rotação?
A altura de uma sub-árvore diminui enquanto a altura da outra aumenta.
Garante uma árvore proxima do preenchimento completo (melhor caso).
Operações de inserção e busca em O(log n).
13
ÁRVORE BINÁRIA BALANCEADA (AVL)
Rotação
Simples: ocorre quando um nó está
desbalanceado e seu filho estiver
inclinado
no
mesmo sentido (ou sem inclinação).
Dupla ocorre quando um nó estiver
ROTACAO SIMPLES
15
ROTACAO SIMPLES
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
Pivot = Root.OS Root.OS = Pivot.RS
Pivot.RS = Root Root = Pivot
17
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root
Root = Pivot
root
Q
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
Pivot = Root.OS Root.OS = Pivot.RS
Pivot.RS = Root Root = Pivot
root
Q
P C
A B 19
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
rootpivot Q
P C
A B
Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root
Root = Pivot
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
rootpivot Q
P C
A B
Pivot = Root.OS Root.OS = Pivot.RS
Pivot.RS = Root Root = Pivot
21
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
rootpivot Q
P C
Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
rootpivot Q
P C
A B
Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root Root = Pivot
23
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
rootpivot Q
P C
A B
Pivot = Root.OS Root.OS = Pivot.RS
Pivot.RS = Root
Root = Pivot
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
rootpivot Q
P C
A B
Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root Root = Pivot
25
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
root
P Pivot = Root.OS
Root.OS = Pivot.RS Pivot.RS = Root Root = Pivot
ROTACAO
Generalizacao da rotacao:
Root – nó pai das subarvores a serem rotacionadas
Pivot – o nó que será o novo pai
RS – filho do mesmo lado da rotacao (rotation side)
OS – filho do lado oposto da rotacao (opposite side)
Pseudo-código:
root Q P C A B Pivot = Root.OSRoot.OS = Pivot.RS Pivot.RS = Root Root = Pivot
pivot
Qual a ordem de complexidade da rotacao?
27
ROTACAO: ANALISE DE CASOS
Representacao
Casos: Left-Left e Right-Right
Resolvidos com rotacao SIMPLES no sentido contrário da inclinacao
Left-Left: raiz pesa pra esquerda e filho esquerdo pesa pra esquerda ou esta balanceado: rotação pra direita na raiz
Right-right: raiz pesa pra direita e filho pesa pra direita ou esta balanceado: rotação pra esquerda na raiz
1
0
2 -2
-1 0 0 0 2 0 -2 0 0 0
LL RR
ROTACAO: ANALISE DE CASOS
Representacao
Casos: Left-Right e Right-Left
Resolvidos rotação DUPLA seguindo o mesmo sentido do caso aplicando primeiro no filho e depois no pai
Left-Right: raiz pesa pra esquerda e filho esquerdo
pesa pra direita: rotacao esquerda no filho e direita no pai
Right-Left: raiz pesa pra direita e filho direito pesa
pra esquerda: rotacao direita no filho e esquerda no pai
-1
0
2 -2
1
0
LR RL
29
OPERAÇÕES SOBRE ARVORE AVL
Inserções:
Insere normalmente e depois reajusta a árvore (se necessário) para deixá-la balanceada novamente
Remoções:
Remove o nó normalmente como na BST depois reajusta a árvore (se necessário) para deixá-la balanceada novamente
Fazem uso de rotações convenientes em nós
desbalanceados: simples (LL,RR) ou dupla (RL,
LR)
Abordagem recursiva é mais simples para ambas
as operações
31
ARVORE AVL
Questoes de implementacao
Como seria implementada uma arvore AVL em Java?
É possível usar herança na implementação de AVL?
ARVORE AVL
Questoes de implementacao
Como seria implementada uma arvore AVL em Java?
É possível usar herança na implementação de AVL?
public interface AVLTree<T extends Comparable<T>> extends BST<T>{
}
33
ARVORE AVL
Que métodos precisam ser redefinidos?
public interface AVLTreeImpl<T extends Comparable<T>> extends BSTImpl<T>{
public boolean isEmpty(); public int height();
public boolean search(T element); public void insert(T element); public T maximum();
public T minimum();
public void remove(T element); public T[] preOrder();
ARVORE AVL
Que métodos precisam ser redefinidos?
public interface AVLTreeImpl<T extends Comparable<T>> extends BSTImpl<T>{
public boolean isEmpty(); public int height();
public boolean search(T element); public void insert(T element); public T maximum();
public T minimum();
public void remove(T element); public T[] preOrder();
public T[] order(); public T[] postOrder(); public int size();
}
35
ARVORE AVL
Como seria a redefinição da inserção?
Insert (T element){
Insert-recursive(root,element); }
Insert-recursive(BSTNode node, T element){ ...
}
ARVORE AVL
Como seria a redefinição da inserção?
Insert-recursive(BSTNode node, T element){ if(node=NIL){
node.data = element node.left = NIL node.right = NIL }else{
if(element < node.data){
Insert-recursive (node.left, element) }else if (element > node.data){
Insert-recursive (node.right, element) }
rebalance(node) }
} 37
ARVORE AVL
Como seria a redefinição da remoção?
remove (T element){
BSTNode<T> found = search(element); remove-recursive(found);
}
Remove-recursive(BSTNode node){ ...
ARVORE AVL
Como seria a redefinição da remoção?
node = NILrebalanceUp(node)
}else if (node has one child){
if node != root if(node is left child){ if(node.left != NIL)
node.left is left child of node.parent else
node.right is left child of node.parent else //node is right child
if(node.left != NIL)
node.left is right child of parent else
node.right is right child of parent else
root = not NIL child rebalanceUp(node)
}else{
BSTNode sucessor = sucessor(node); node.data = sucessor.data
Remove-recursive (sucessor); } } } 39
ARVORE AVL
Como seria a redefinição da remoção?
Remove-recursive(BSTNode node) {if(node != NIL){ if(node is leaf){ node = NIL
rebalanceUp(node)
}else if (node has one child){ if node != root
if(node is left child){ if(node.left != NIL)
node.left is left child of node.parent else
node.right is left child of node.parent else //node is right child
if(node.left != NIL)
node.left is right child of parent else
node.right is right child of parent else
root = not NIL child rebalanceUp(node) }else{
BSTNode sucessor = sucessor(node); node.data = sucessor.data;
Remove-recursive (sucessor); }
}
rebalanceUp(BSTNode<T> node) { BSTNode parent = node.parent while (parent != null) {
rebalance(parent); parent = parent.parent; }
}
ARVORE AVL
Que métodos auxilares a AVL precisa ter?
public interface AVLTreeImpl<T extends Comparable<T>> extends BSTImpl<T>{
public void insert(T element); public void remove(T element);
}
41
ARVORE AVL
Que métodos auxilares a AVL precisa ter?
public interface AVLTreeImpl<T extends Comparable<T>> extends BSTImpl<T>{
public void insert(T element); public void remove(T element);
private int calculateBalance(BSTNode<T> node)
private void rebalance(BSTNode<T> node) private void rebalanceUp(BSTNode<T> node) private void leftRotation(BSTNode<T> node) private void rightRotation(BSTNode<T> node)
ARVORE AVL
Como seria o método calcular o balance de uma
árvore AVL?
int calculateBalance(BSTNode<T> node) { if node != NIL
return height (node.left) – height (node.right) }
43
ARVORE AVL
Como seria o rebalanceamento de uma arvore?
void rebalance(BSTNode<K,V> node){ balance = calculateBalance(node) se |balance| > 1
determina o caso de balanceamento aplica a rotacao adequada (LL,RR,LR,RL) }
ARVORE AVL
Como seriam os métodos de rotacao a esquerda e
a direita?
É só implementar o algoritmo genérico
Uma implementacao é o espelho (inverso) da outra
Pivot = Root.OS
Root.OS = Pivot.RS
Pivot.RS = Root
Root = Pivot
45
REFERÊNCIAS