Você está na página 1de 54

Árvores Binárias Balanceadas

Introdução
• Em uma árvore binária o tempo de execução para procurar
uma informação depende diretamente da distância do
nodo que contém esta informação até a raiz da árvore.
• Árvores balanceadas têm por objetivo otimizar as
operações de consulta, diminuindo o número médio de
comparações efetuadas até que um determinado nodo
seja encontrado.
• Devido ao balanceamento da árvore, as operações de
busca, inserção e remoção em uma árvore com n
elementos podem ser efetuadas em O(log2n), mesmo no
pior caso.
Árvore Binária de Busca Balanceada
• A altura de uma árvore binária é o nível máximo de suas
folhas (profundidade).
• Uma ABB balanceada é qualquer árvore de busca
binária que automaticamente mantém a sua altura
pequeno mesmo depois de sucessivas inserções e
exclusões arbitrárias.

Árvore balanceada
Exemplos de árvores balanceadas
• Árvore AVL
• Árvore 2-3-4
• Árvore Rubro-Negra
Árvore Binária Balanceada (AVL)
• Uma árvore binária balanceada (AVL) é uma
árvore binária na qual as alturas das duas
subárvores de todo nó difere no máximo em 1
nível.
• Proposta em 1962 pelos matemáticos
soviéticos G.M. Adelson-Velskii e E.M. Landis
– Métodos de inserção e remoção de elementos da
árvore de forma que ela fique balanceada
Busca - Árvore (AVL)
Fator de Balanceamento
• O fator de balanceamento (FB) de um nó é
definido como a altura de sua subárvore esquerda
menos a altura de sua subárvore direita:
FB = alt_subárv_esquerda –
alt_subárv_direita

• Atualizados sempre que a árvore é alterada


(elemento é inserido ou removido).
• O fator de balanceamento de uma folha é zero.
Fator de Balanceamento
• Cada nó numa árvore binária balanceada
(AVL) tem balanceamento de 1, -1 ou 0.
Fator de Balanceamento
• Se o valor do balanceamento do nó for diferente de 1, -
1 e 0 (um fator se torna +2 ou -2) deve-se executar
operações de balanceamento.
Quais árvores são AVL?
Quais árvores são AVL?
Balanceamento da Árvore
• O balanceamento da árvore é corrigido através das
chamadas rotações.
• Rotação é a operação básica para balanceamento
da árvore AVL.
• As rotações podem ser:
– Simples: O nó desbalanceado e seu filho estão no
mesmo sentido da inclinação;
– Duplas: O nó desbalanceado e seu filho estão inclinado
no sentido inverso do pai (equivale a duas rotações
simples).
Balanceamento da Árvore
• Existem 4 tipos básicos de rotações:
– Rotação simples à esquerda (Rotação RR);
– Rotação simples à direita (Rotação LL);
– Rotação dupla à esquerda (Rotação RL); e
– Rotação dupla à direita (Rotação LR).

• Se o FB é positivo, as rotações são feitas à direita;


• Se FB é negativo, as rotações são feitas à
esquerda.
Fator de Balanceamento
• Há dois tipos de ocorrências nos casos de
balanceamento:
1. 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.
Rotação Simples à Esquerda (RR)

FB = -2
FB = 0

FB = -1
FB = 0 FB = 0

FB = 0

Nó inserido

• O filho da direita vira a nova raiz.


• A raiz original vira filho da esquerda da nova raiz.
Rotação Simples à Esquerda (RR)

• O filho da esquerda do filho da direita vira filho da direita do


filho da esquerda.
Rotação Simples à Direita (LL)

FB = +2
FB = 0

FB = +1
FB = 0 FB = 0

FB = 0

Nó inserido

• O filho da esquerda vira a nova raiz.


• A raiz original vira filho da direita da nova raiz.
Rotação Simples à Direita (LL)

Nó inserido

• O filho da direita do filho da esquerda vira filho da esquerda do


filho da direita.
Fator de Balanceamento
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
Rotação Dupla à Esquerda (RL)

FB = -2 FB = 0
FB = -2

FB = -1 FB = 0 FB = 0
FB = 1

FB = 0 FB = 0

Nó inserido

Rotação à direita na Rotação à esquerda na


subárvore da direita. subárvore original.
Rotação Dupla à Direita (LR)

FB = +2 FB = +2

FB = 0

FB = -1 FB = +1

FB = 0 FB = 0

FB = 0 FB = 0

Nó inserido
Rotação à esquerda na Rotação à direita na
subárvore da esquerda. subárvore original.
Rotação Dupla
• FB(raiz) = 3 – 1 = +2
Rotação Simples
Rotação Simples

Rotação
simples
Rotação Dupla
Rotação Dupla

Rotação
Dupla
Qual Rotação Utilizar?
Calcule FB
Se (FB >= -1 e FB <= 1)
A árvore está Balanceada.
Se (FB > 1)
Se a Subárvore da Esquerda tem FB > 0
Rotação à Direita
Senão
Rotação Dupla à Direita
Senão
Se a Subárvore da Direita tem FB < 0
Rotação à Esquerda
Senão
Rotação Dupla à Esquerda
Fator de Balanceamento
Implementação de Árvore AVL
• Com exceção das operações de inserção e
remoção, as demais funções da árvore AVL são
idênticas as da árvore binária.
AVL – Estrutura de Dados

struct TreeNode {
int info;
int fb; /*fator de balanceamento*/
struct TreeNode *left;
struct TreeNode *right;
};
typedef struct TreeNode *Arv;
Rotação Simples à Direita (LL)
void rot_dir(Arv *r)
{
Arv *b=*r;
Arv *a=b->esq;
b->esq=a->dir;
a->dir=b;
a->fb=0;
b->fb=0;
*r=a;
}
Rotação Simples à Direita (LL)
Rotação Simples à Esquerda (RR)
void rot_esq(Arv *r) {
Arv *a=*r;
Arv *b=a->dir;
a->dir=b->esq;
b->esq=a;
a->fb=0;
b->fb=0;
*r=b;
}
Rotação Simples à Esquerda (RR)
Rotação Dupla Esquerda e Direita (LR)
void rot_esq_dir (Arv *r)
{
Arv *c=*r;
Arv *a=c->esq;
Arv *b=a->dir;
c->esq=b->dir;
a->dir=b->esq;
b->esq=a;
b->dir=c;
/* atualizar fb de a e c em função de b (nova raiz) */
switch (b->fb) {
case -1: a->fb=1; c->fb=0; break;
case 0: a->fb=0; c->fb=0; break;
case 1: a->fb=0; c->fb=-1; break;
}
b->fb=0;
*r=b;
}
Rotação Dupla Esquerda e Direita (LR)
Rotação Dupla Direita e Esquerda (RL)
void rot_dir_esq(Arv *r)
{
Arv *a=*r;
Arv *c=a->dir;
Arv *b=c->esq;
c->esq=b->dir;
a->dir=b->esq;
b->esq=a;
b->dir=c;
/* atualizar fb de a e c em função de b (nova raiz) */
switch (b->fb) {
case -1: a->fb=1; c->fb=0; break;
case 0: a->fb=0; c->fb=0; break;
case 1: a->fb=0; c->fb=-1; break;
}
b->fb=0;
*r=b;
}
Rotação Dupla Direita e Esquerda (RL)
Inserção em uma Árvore AVL
• Para inserir um valor v na árvore:
• Se raiz é NULL
• Insira o nó
• Se v < raiz
• Muda para a subárvore da esquerda
• Se v > raiz
• Muda para a subárvore da direita
• Aplique o método recursivamente

• Ao voltar da recursão, recalcule as alturas de


cada subárvore
• Aplique a rotação necessária se o FB passar para
+2 ou -2
Inserção em Árvore AVL
• Inserção dos nós 1, 2 e 3.
• Ao inserir 3, o nó raiz fica desbalanceado (-2)
Inserção em Árvore AVL
• Inserção dos nós 4 e 5.
• 4: continua balanceada
• 5: desbalanceamento do nó 3 (-2)
Inserção em Árvore AVL
• Inserção do nó 6
• Nó 2 fica desbalanceado (-2)
Inserção em Árvore AVL
• Inserção do nó 7
• Nó 5 fica desbalanceado (-2)
Inserção em Árvore AVL
• Inserção dos nós 15 e 14
• Nó 7 fica desbalanceado (-2)
• Rotação dupla: 14 e 15 à direita e depois 7 e 14 à
esquerda.
Inserção em Árvore AVL
• Inserção do nó 13
• Rotação do 7 e 14 à direita
• Rotação de 6 e 7 à esquerda
Inserção em Árvore AVL
• Inserção do nó 12
• Nó 4 fica desbalanceado (-2)
• Rotação da raiz à esquerda
Inserção em Árvore AVL
• Inserção do nó 11
• Nó 13 fica desbalanceado (+2)
• Rotação de 12 e 13 à direita
Remoção em Árvore AVL

Remover o elemento 4.
Remoção em Árvore AVL

Realizar uma Rotação LL.


Remoção em Árvore AVL

Árvore binária depois do rebalanceamento.


Remoção em Árvore AVL

Remover o elemento 8. Sem necessidade de


rebalanceamento.
Remoção em Árvore AVL

Remover o elemento 6.
Remoção

Realizar uma Rotação RR. Depois do rebalanceamento.


Referências
• PUSHPA, Suri e VINOD, Prasad, Binary Search Tree Balancing Methods: A
Critical Study, IJCSNS International Journal of Computer Science and Network
Security, v.7, n.8, August, 2007. Disponível em:
http://paper.ijcsns.org/07_book/200708/20070834.pdf

• Vídeo Aulas do Prof. André Backes (www.facom.ufu.br/~backes/)


– Aula 78 - Árvores Balanceadas: https://www.youtube.com/watch?v=Au-6c55J90c
– Aula 79 - Árvore AVL: Definição: https://www.youtube.com/watch?v=4eO3UbTiRyo
– Aula 80 - Árvore AVL: Implementação: https://www.youtube.com/watch?v=I5cl39jdnow
– Aula 81 - Árvore AVL: Tipos de Rotação: https://www.youtube.com/watch?v=1HkWqH7L2rU
– Aula 82 - Árvore AVL: Implementando as Rotações:
https://www.youtube.com/watch?v=6OJ8stXwdq0
– Aula 83 - Árvore AVL: Inserção: https://www.youtube.com/watch?v=lQsVUxa3Auk
– Aula 84 - Árvore AVL: Remoção: https://www.youtube.com/watch?v=F7_Daymw-WM
– https://www.youtube.com/watch?v=JAeQuNsKQWk
– http://dcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-AVL.pdf
– https://www.youtube.com/watch?v=6-WfgJQF4Uw

Você também pode gostar