05/06/2013
1
Árvores Balanceadas André Pimenta Freire
GCC109 – Algoritmos e Estrutura de Dados III
Universidade Federal de Lavras
Resumo
• Definição de balanceamento em árvores
• Balanceamento global e local
• Balanceamento global com algoritmo DSW
• Balanceamento local com árvores AVL
Objetivos da aula
• Ao final desta aula, espera-se que os alunos sejam capazes de – Explicar como definir a importância de efetuar
balanceamentos em árvores
– Explicar as diferenças entre balanceamento global e local, e quando são mais adequados
– Explicar como efetuar rotações a esquerda e direita
– Explicar o funcionamento do algorito DSW e suas fases para balanceamento global
– Explicar as definições de árvores AVL e as operações necessárias para mante-las balanceadas.
Árvores Balanceadas
• Para que uma árvore seja, de fato, um mecanismo eficiente, é preciso que os seus elementos estejam distribuídos de forma relativamente homogênea pela estrutura (subárvores);
• Como as operações de inserção e remoção são
aleatórias, é preciso ter um operador capaz de
manter os elementos distribuídos de forma
homogênea entre as subárvores;
• Esse é o operador de balanceamento.
Árvores Balanceadas
• Uma árvore binária é dita de altura balanceada (ou simplesmente balanceada) se as alturas de duas sub-árvores quaisquer de qualquer nó diferem por no máximo 1. Ou seja, a diferença entre a alturas das sub-árvores de qualquer nó é sempre 1 ou 0.
• Uma árvore é dita perfeitametne balanceada se ela for balanceada e todos os nós-folha estiverem no mesmo nível.
Árvores Binárias Balanceadas
O balanceamento de uma árvore pode ser feito
segundo duas estratégias:
Global – envolvendo toda a árvore
Exemplo: Algoritmo DSW
Local – envolvendo apenas uma parte da árvore
Exemplo: árvores AVL ou árvores Rubronegras
05/06/2013
2
Balanceamento Global
• No balanceamento global a árvore balanceada
pode ser construída a partir de uma estrutura
externa;
• Nesse caso o algoritmo é relativamente simples,
bastando criar uma lista ordenada com o conteúdo
da árvore (antes ou mesmo depois da existência
da árvore);
• Dessa lista constróise a árvore já balanceada.
Algoritmo DSW
• O problema da estratégia de balanceamento global
é a necessidade de uma estrutura externa à árvore
• Uma solução para esse problema é apresentada
através do algoritmo DSW (Colin Day, Quentin
Stout e Bette Warren)
• No algoritmo DSW o que se faz é transformar a
árvore em uma espinha dorsal (árvore com formato
de lista) e depois reconstruir a árvore, sempre com
operações de rotação
Balanceamento e rotações
• O principal componente para transformações de árvores no algoritmo DSW é a rotação.
• Há dois tipos de rotação: rotação à direita e rotação à esquerda, que são simétricas.
• A rotação de uma árvore ocorre em torno de sua raiz.
• Nas rotações a seguir, sempre serão feitas rotações de um nó filho ao redor do seu pai. Filhos à esquerda são rotacionados para a direita em torno do pai, e filhos à direita são rotacionados para a esquerda em torno do pai.
Rotação à direita
Avô
Pai
Filho
R
Q P
S
Árvore antes da rotação
Avô
Pai
Filho
R Q
P
S
Árvore depois da rotação
Rotação à direita - exemplo
Árvore antes da rotação
de 16 em torno do 19
14
1
0 2
19
16 20
18 15
17
14
1
0 2 19
16
20 18
15
17
Árvore após a rotação –
preserva as propriedades de
ABB
Rotação à esquerda
Avô
Pai
Filho
R
Q P
S
Árvore antes da rotação
Avô
Pai
Filho
R Q
P
S
Árvore depois da rotação
05/06/2013
3
Rotação à esquerda - exemplo
Árvore antes da rotação
do 15 ao redor de 10
24
35
40 28
10
15 6
12 18
14
24
35
40 28 10
15
6 12
18
14
Árvore após a rotação –
presenva as propriedades de
ABB
Passos do algoritmo DSW
• O algoritmo DSW envolve dois passos para a criação de uma árvore perfeitamente balanceada.
• O primeiro passo transforma uma árvore desbalanceada em uma espinha dorsal. A espinha dorsal é simplesmente uma lista linear ordenada que contém os elementos da ABB.
• A segunda etapa converte a espinha dorsal em uma árvore perfeitamente balanceada por meio da realização de uma série de rotações. O número de rotações é dado em função do número de nós e na altura da árvore final.
Pseudocódigo – Etapa 1 // Cria a espinha dorsal de uma árvore desbalanceada
criarEspinhaDorsal(raiz, n)
{
tmp = raiz;
while (tmp != null)
if tmp tem um filho à esquerda
rotacionar o filho ao redor de tmp; //rotação
à direita
defina tmp como o filho que acabou de virar
o pai;
else defina tmp como o filho à direita;
}
Exemplo – etapa 1
10
5
23
40
20
30 15
25
28
tmp
10
5
23
40
20
30 15
25
28
tmp
10
5
15
20
23
40
30
25
28
Exemplo – etapa 1
10
5
15
20
23
40
30
25
28
tmp
10
5
15
20
23
40
30
25
28
10
5
15
20
25
23
40
30
28
Algoritmo DSW – Etapa 2
• Na segunda fase, a espinha é transformada em uma árvore, mas perfeitamente balanceada com folhas somente em níveis adjacentes.
• Em cada passo em direção abaixo na espinha, todo segundo nó é rotacionado ao redor do pai.
• Cada passo reduz o tamanho da espinha pela metade. • Somente a primeira rodada pode não atingir o fim. Neste
caso, utiliza-se a aproximação mais próxima possível do número de nós para uma árvore balanceada, com o número de 2lg(n+1)-1 nós. Os demais são tratados separadamente..
05/06/2013
4
Etapa 2 - Pseudocódigo
criarArvoreBalanceada(n)
m = 2lg(n+1) -1; //n é o número de nós
//realizar rotações à esquerda
fazer n-m rotações começando pelo topo
//Fazer o restante das rotações
necessárias
while (m > 1)
m = m/2;
fazer m rotações começando pelo
primeiro filho à direita do topo;
DSW – segunda etapa -
exemplo
10
5
15
20
25
23
28
30
1. Espinha inicial. Valor
de N = 9. Valor de m= 7 com , 2lg(n+1) -1 =
2lg(9+1) -1 = 23-1 =
7. Então, n-m = 9-7
= 2, portanto, duas rotações iniciais
40
10
5
15
20
25
23
28
30 2. Árvore depois
das duas rotações iniciais
40
DSW – segunda etapa -
exemplo 10
5
15
20
25
23
28
30 3. M começa com 7. Ao
entrar no loop, o valor
é definido como 3
(7/2 = 3). Três
rotações são feitas. 40
10
5 15
20
25
23
28
30
4. Depois da primeira
rotação do 20 ao redor do 10
40
DSW – segunda etapa -
exemplo
10
5 15
20
25
23 28
30
5. Depois da rotação
do 25 em torno do 23
40
6. Depois da terceira
rotação do 30 ao redor do 28
10
5 15
20
25
23
28
30
40
DSW – segunda etapa -
exemplo
10
5 15
20
25
23
28
30
40
7. Voltando no loop
m = m/2, logo m = 3/1 = 1
8. Árvore final balanceada
10
5 15
20
25
23 28
30
40
Balanceamento Local
• O balanceamento local faz uso de algoritmos que
trabalham apenas em parte da árvore, a cada
inserção ou remoção;
• Algoritmos desse tipo podem ser representados
pelas árvores AVL ou árvores Rubronegras.
05/06/2013
5
Árvores AVL
• Recebem esse nome em homenagem aos seus criadores,
os matemáticos russos AdelsonVelskii e Landis, 1962.
• Uma árvore AVL é uma árvore binária de pesquisa onde a
diferença em altura entre as subárvore esquerda e direita é
no máximo 1 (positivo ou negativo).
• Quando a diferença chega a 2 ou –2, deve ser refeito o
balanceamento através de rotações.
• Chamamos essa diferença de “fator de balanceamento”.
Árvores AVL
Assim, para cada nó podemos definir um fator de
balanceamento (FB), que vem a ser um número inteiro
igual a:
FB(nó p) = altura(subárvore direita p) - altura(subárvore
esquerda p)
O FB de um nó folha será sempre 0.
Árvores AVL
FB(nodo p) = altura(subárvore direita p) - altura(subárvore
esquerda p)
6
2 8
1 4
3
12
alt_d = 2
alt_e = 3
FB = 2 – 3 = -1
Árvores AVL
FB(nodo p) = altura(subárvore direita p) - altura(subárvore
esquerda p)
6
2 8
1 4
3
12
FB = -1 alt_d = 1
alt_e = 0
FB = 1 – 0 = 1
Árvores AVL
FB(nodo p) = altura(subárvore direita p) - altura(subárvore
esquerda p)
6
2 8
1 4
3
12
FB = -1
FB = 1
alt_d = 0
alt_e = 0
FB = 0 – 0 = 0
Árvores AVL
FB(nodo p) = altura(subárvore direita p) - altura(subárvore
esquerda p)
6
2 8
1 4
3
12
FB = -1
FB = 1
FB = 0
alt_d = 2
alt_e = 1
FB = 2 – 1 = 1
05/06/2013
6
Árvores AVL
FB(nodo p) = altura(subárvore direita p) - altura(subárvore
esquerda p)
6
2 8
1 4
3
12
FB = -1
FB = 1
FB = 0
FB = 1
FB = 0
FB = 0
FB = -1
Árvores AVL
• Os números nos nós representam o FB para cada
nó.
• Para uma árvore ser AVL os fatores de balanço
devem ser necessariamente -1, 0, ou 1.
Exemplos de Árvores AVL
1
1
0
0
0
-1
-1
0
0
-1
0 0
0 0
-1
Exemplos de Árvores não-AVL
0
0
+2
-1
-2
+1
0
0
-2
-1
Balanceamento de Árvores AVL
• Inicialmente inserimos um novo nó na árvore.
• A inserção deste novo nó pode ou não violar a propriedade de balanceamento.
• Caso a inserção do novo nó não viole a propriedade de balanceamento podemos então continuar inserindo novos nós.
• Caso contrário precisamos nos preocupar em restaurar o balanço da árvore. A restauração deste balanço é efetuada através do que denominamos ROTAÇÕES na árvore.
Exemplos de
Balanceamento de Árvores AVL • Vamos considerar a seguinte árvore (os números ao lado dos nós
são o FB de cada nó):
• A árvore acima está balanceada, como podemos observar pelos FB de cada nó.
8
4
2 6
10 0
0
0 0
-1
05/06/2013
7
Exemplos de
Balanceamento de Árvores AVL
• Existem 2 casos possíveis de desbalanceamento da árvore:
– Tipo 1: é necessário fazer uma rotação dupla para manter a árvore balanceada
– Tipo 2: é necessário fazer uma rotação simples para manter a árvore balanceada
Dicas
• Para identificarmos quando uma rotação é simples ou dupla, observamos os sinais de FB:
– se o sinal for igual, a rotação é simples.
• Se FB+ rotação para esquerda
• Se FB- rotação para direita
– se o sinal for diferente a rotação é dupla.
– Mais detalhes na tabela de “Descrição de Rotações”
Exemplos de
Balanceamento de Árvores AVL
• Tipo 1: Ao inserir o número 5 na árvore.
8
4
2 6
10 0
0
0 0
-1
8
4
2 6
10 0
1
0 -1
-2
5 0
Exemplos de
Balanceamento de Árvores AVL • Tipo 1: Ao inserir o número 5 na árvore.
8
4
2 6
10 0
0
0 0
-1
8
4
2 6
10 0
1
0 -1
-2
5 0
Solução para manter o balanceamento: Como os sinais dos FB são diferentes, efetuar duas rotações, também
denominada ROTAÇÃO DUPLA.
Exemplos de
Balanceamento de Árvores AVL
• Tipo 2: Ao inserir o número 3 na árvore.
8
4
2 6
10 0
0
0 0
-1
8
4
2 6
10 0
-1
1 0
-2
3 0
Exemplos de
Balanceamento de Árvores AVL
• Tipo 2: Ao inserir o número 3 na árvore.
8
4
2 6
10 0
0
0 0
-1
8
4
2 6
10 0
-1
1 0
-2
3 0
Solução para manter o balanceamento: Como os sinais dos FB são os mesmos, efetuar uma rotação, também
denominada ROTAÇÃO SIMPLES.
05/06/2013
8
Descrição das rotações
Diferença de altura de um nó
Diferença de altura do nó filho do nó desbalanceado
Tipo de rotação
2
1 Simples à esquerda
0 Simples à esquerda
-1
Dupla com filho para a direita e pai para a esquerda
-2
1
Dupla com filho para a esquerda e pai para a direita
0 Simples à direita
-1 Simples à direita
Descrição das rotações
Diferença de altura de um nó
Diferença de altura do nó filho do nó desbalanceado
Tipo de rotação
2
1 Simples à esquerda
0 Simples à esquerda
-1
Dupla com filho para a direita e pai para a esquerda
-2
1
Dupla com filho para a esquerda e pai para a direita
0 Simples à direita
-1 Simples à direita
Exemplos de Balanceamento Rotação simples à esquerda
6
8 0
1
Árvore Balanceada
6
8 1
2
Árvore Desbalanceada
12 0
+ 12
Exemplos de Balanceamento Rotação simples à esquerda
6
8 0
1
Árvore Balanceada
6
8 1
2
Árvore Desbalanceada
+ 12
12 0
Nó desbalanceado
Filho do nó desbalanceado
Exemplos de Balanceamento
Rotação simples à esquerda
6
8 0
1
Árvore Balanceada
6
8 1
2
Árvore Desbalanceada
12 0
+ 12
Rotação simples para a esquerda
Exemplos de Balanceamento
Rotação simples à esquerda
6
8 0
1
Árvore Balanceada
6
8 1
2
Árvore Desbalanceada
12 0
+ 12
8 0
0
6 12 0
Árvore Balanceada
05/06/2013
9
Descrição das rotações
Diferença de altura de um nó
Diferença de altura do nó filho do nó desbalanceado
Tipo de rotação
2
1 Simples à esquerda
0 Simples à esquerda
-1
Dupla com filho para a direita e pai para a esquerda
-2
1
Dupla com filho para a esquerda e pai para a direita
0 Simples à direita
-1 Simples à direita
Exemplos de Balanceamento
Rotação simples à esquerda Árvore Balanceada Árvore Desbalanceada
- 6
12 0
1
14 0
10
11
6
0
0 12
0
2
14 0
10
11 0
Exemplos de Balanceamento Rotação simples à esquerda
Árvore Balanceada Árvore Desbalanceada
- 6
12 0
1
14 0
10
11
6
0
0 12
0
2
14 0
10
11 0
Nó desbalanceado
Filho do nó desbalanceado
Exemplos de Balanceamento Rotação simples à esquerda
Árvore Balanceada Árvore Desbalanceada
- 6
12 0
1
14 0
10
11
6
0
0 12
0
2
14 0
10
11 0
Rotação simples para a esquerda
Exemplos de Balanceamento
Rotação simples à esquerda Árvore Balanceada Árvore Desbalanceada
- 6
12 0
1
14 0
10
11
6
0
0 12
0
2
14 0
10
11 0
Árvore Balanceada 12
-1
14 0
10 1
11 0
Descrição das rotações
Diferença de altura de um nó
Diferença de altura do nó filho do nó desbalanceado
Tipo de rotação
2
1 Simples à esquerda
0 Simples à esquerda
-1
Dupla com filho para a direita e pai para a esquerda
-2
1
Dupla com filho para a esquerda e pai para a direita
0 Simples à direita
-1 Simples à direita
05/06/2013
10
Rotação dupla com filho para a direita e pai para a esquerda
6
8 0
1
Árvore Balanceada
6
8 -1
2
Árvore Desbalanceada
7 0
+ 7 6
8 0
1
Árvore Balanceada
6
8 -1
2
Árvore Desbalanceada
7 0
+ 7
Nó desbalanceado
Filho do nó desbalanceado
Rotação dupla com filho para a direita e pai para a esquerda
6
8 0
1
Árvore Balanceada
6
8 -1
2
Árvore Desbalanceada
7 0
+ 7
Rotação dupla com filho para a direita e pai para a esquerda
Rotação para a direita no filho do nó desbalanceado
6
8 0
1
Árvore Balanceada Árvore Desbalanceada
6
8 -1
2
7 0
+ 7
Rotação dupla com filho para a direita e pai para a esquerda
6
7 1
2
8 0
Árvore Desbalanceada
6
8 0
1
Árvore Balanceada Árvore Desbalanceada
6
8 -1
2
7 0
+ 7
Rotação dupla com filho para a direita e pai para a esquerda
Rotação para a esquerda no nó desbalanceado
6
7 1
2
8 0
Árvore Desbalanceada
6
8 0
1
Árvore Balanceada Árvore Desbalanceada
6
8 -1
2
7 0
+ 7
Rotação dupla com filho para a direita e pai para a esquerda
6
7 0
0 8 0
Árvore Balanceada
6
7 1
2
8 0
Árvore Desbalanceada
05/06/2013
11
Descrição das rotações
Diferença de altura de um nó
Diferença de altura do nó filho do nó desbalanceado
Tipo de rotação
2
1 Simples à esquerda
0 Simples à esquerda
-1
Dupla com filho para a direita e pai para a esquerda
-2
1
Dupla com filho para a esquerda e pai para a direita
0 Simples à direita
-1 Simples à direita
Rotação dupla com filho para a esquerda e pai para a direita
6
3 0
1
Árvore Balanceada Árvore Desbalanceada
+ 5 6
3 1
-2
5 0
Rotação dupla com filho para a esquerda e pai para a direita
6
3 0
1
Árvore Balanceada Árvore Desbalanceada
+ 5 6
3 1
-2
5 0
Nó desbalanceado
Filho do nó desbalanceado
Rotação dupla com filho para a esquerda e pai para a direita
6
3 0
1
Árvore Balanceada Árvore Desbalanceada
+ 5 6
3 1
-2
5 0
Rotação para a esquerda no filho do nó desbalanceado
Rotação dupla com filho para a esquerda e pai para a direita
6
3 0
1
Árvore Balanceada Árvore Desbalanceada
+ 5 6
3 1
-2
5 0
Árvore Desbalanceada
6
5 -1
-2
3 0
6
3 0
1
Árvore Balanceada Árvore Desbalanceada
+ 5 6
3 1
-2
5 0
Árvore Desbalanceada
Rotação para a direita no nó desbalanceado
6
5 -1
-2
3 0
Rotação dupla com filho para a esquerda e pai para a direita
05/06/2013
12
Rotação dupla com filho para a esquerda e pai para a direita
6
3 0
1
Árvore Balanceada Árvore Desbalanceada
+ 5 6
3 1
-2
5 0
Árvore Desbalanceada
6
5 -1
-2
3 0
Árvore Balanceada
6
5 0
0
3
0
Descrição das rotações
Diferença de altura de um nó
Diferença de altura do nó filho do nó desbalanceado
Tipo de rotação
2
1 Simples à esquerda
0 Simples à esquerda
-1
Dupla com filho para a direita e pai para a esquerda
-2
1
Dupla com filho para a esquerda e pai para a direita
0 Simples à direita
-1 Simples à direita
Exemplos de Balanceamento Rotação simples à direita
Árvore Balanceada Árvore Desbalanceada
- 14
14
0
-1
8 0
10
2
6
0
0
-2
8 0
10
2
6
0
0
Exemplos de Balanceamento Rotação simples à direita
Árvore Balanceada Árvore Desbalanceada
- 14
14
0
-1
8 0
10
2
6
0
0
-2
8 0
10
2
6
0
0
Nó desbalanceado
Filho do nó desbalanceado
Exemplos de Balanceamento
Rotação simples à direita Árvore Balanceada Árvore Desbalanceada
- 14
14
0
-1
8 0
10
2
6
0
0
-2
8 0
10
2
6
0
0
Rotação simples para a direita
Exemplos de Balanceamento
Rotação simples à direita Árvore Balanceada Árvore Desbalanceada
- 14
14
0
-1
8 0
10
2
6
0
0
-2
8 0
10
2
6
0
0
Árvore Balanceada
0
10 -1
8
2
6
0
1
05/06/2013
13
Descrição das rotações
Diferença de altura de um nó
Diferença de altura do nó filho do nó desbalanceado
Tipo de rotação
2
1 Simples à esquerda
0 Simples à esquerda
-1
Dupla com filho para a direita e pai para a esquerda
-2
1
Dupla com filho para a esquerda e pai para a direita
0 Simples à direita
-1 Simples à direita
Exemplos de Balanceamento
Rotação simples à direita
8
6 0
-1
Árvore Balanceada Árvore Desbalanceada
+ 2 8
6 -1
-2
2 0
Exemplos de Balanceamento Rotação simples à direita
8
6 0
-1
Árvore Balanceada Árvore Desbalanceada
+ 2 8
6 -1
-2
2 0
Nó desbalanceado
Filho do nó desbalanceado
Exemplos de Balanceamento Rotação simples à direita
8
6 0
-1
Árvore Balanceada Árvore Desbalanceada
+ 2 8
6 -1
-2
2 0
Rotação simples para a direita
Exemplos de Balanceamento
Rotação simples à direita
8
6 0
-1
Árvore Balanceada Árvore Desbalanceada
+ 2 8
6 -1
-2
2 0
Árvore Balanceada
0
8
6 0
2 0
Pseudo-código do algoritmo para construção de uma árvore AVL
1. Insira o novo nó normalmente (da mesma maneira que inserimos numa árvore binária de pesquisa);
2. Iniciando com o nó pai do nó recém-inserido, teste se a propriedade AVL é violada neste nó (ou seja, teste se o FB deste nó é >1 ou < -1). Existe 2 possibilidades:
2.1 A condição AVL foi violada
2.1.1 Execute as operações de rotação conforme for o caso (vide tabela de descrições)
2.1.2 Volte ao passo 1
2.2 A condição AVL não foi violada
Se o nó recém-testado não tem pai, ou seja, é o nó raiz da árvore, volte para inserir novo nó (Passo 1)
05/06/2013
14
Exemplo
Construir uma árvore AVL com os seguintes dados:
– Inserir inicialmente 10, 20, 30
– Se necessário fazer balanceamento.
– Inserir 25 e 27
– Se necessário fazer balanceamento
Exemplo
A inserção dos 3 primeiros números resulta na seguinte árvore:
Após a inserção do elemento 30 a árvore fica desbalanceada. Para balancear a árvore acima, é necessário apenas uma rotação. Fazemos uma rotação para a esquerda no nó com FB 2. A árvore resultante fica:
Exemplo
• O passo seguinte é inserir os nós 25 e 27. A árvore fica desbalanceada apenas após a inserção do nó 27.
• Neste caso, para manter a árvore balanceada, é necessário fazer um rotação dupla.
Exemplo
• O nó 30 tem FB -2 e o seu nó filho tem FB 1. Precisamos efetuar uma rotação dupla, ou seja, uma rotação simples à esquerda do nó 25, resultando:
Exemplo
• Seguida de uma rotação simples à direita do nó 30, resultando:
e a árvore está balanceada.
Exercício 1
• Considere a inserção dos seguintes valores (nesta ordem) em uma árvore AVL: 5,3,8,2,4,7,10,1,6,9,11. Para essas inserções nenhuma rotação é necessária. Desenhe a árvore AVL resultante e determine o fator de balanceamento de cada nó.
05/06/2013
15
Exercício 2
Determinado sistema armazena registros por chaves numéricas em uma árvore AVL. Nessa árvore são inseridos os seguintes valores: 20,10,5,30,25,27 e 28 nessa ordem.
Apresente passo a passo como a árvore vai sendo construída. Realize as rotações necessárias e indique qual rotação foi realizada em cada caso.
Objetivos da aula
• Ao final desta aula, espera-se que os alunos sejam capazes de – Explicar como definir a importância de efetuar
balanceamentos em árvores
– Explicar as diferenças entre balanceamento global e local, e quando são mais adequados
– Explicar como efetuar rotações a esquerda e direita
– Explicar o funcionamento do algorito DSW e suas fases para balanceamento global
– Explicar as definições de árvores AVL e as operações necessárias para mante-las balanceadas.
Referências Utilizadas
• Livro:
ASCENCIO, A. F. G.; ARAÚJO, G. S. Estruturas de
dados: algoritmos, análise da complexidade e
implementações em Java e C/C++. São Paulo:
Pearson Prentice Hall, 2010.
• Baseado nos slides da Profa. Lívia Naiara de
Andrade
Top Related