Escolar Documentos
Profissional Documentos
Cultura Documentos
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
FB = -2
FB = 0
FB = -1
FB = 0 FB = 0
FB = 0
Nó inserido
FB = +2
FB = 0
FB = +1
FB = 0 FB = 0
FB = 0
Nó inserido
Nó inserido
FB = -2 FB = 0
FB = -2
FB = -1 FB = 0 FB = 0
FB = 1
FB = 0 FB = 0
Nó inserido
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
Remover o elemento 4.
Remoção em Árvore AVL
Remover o elemento 6.
Remoção