Sunteți pe pagina 1din 14

ECOI08 Aula 5

Prof. Rafael Santos


Email: rafafic@gmail.com
Balanceando uma rvore binria

Uma das grandes vantagens das rvores


possuir um processo de busca rpido
depende muito de como a rvore.
Para garantir que todos os ns da rvore
possuem um processo de busca rpido
precisamos que a rvore esteja balanceada.
Uma rvore binria balanceada em altura
ou simplesmente balanceada se:
a diferena na altura de ambas as subrvores de
qualquer n na rvore zero ou um.
Balanceando uma rvore binria
Altura Ns em um nvel Ns em todos os nveis
1 20 = 1 1 = 21 1
2 21 = 2 3 = 22 1
3 22 = 4 7 = 23 1
4 23 = 8 15 = 24 1
: : :
11 210 = 1024 2047 = 211 1
: : :
14 213 = 8192 16383 = 214 1
: : :
h 2h-1 n = 2h 1
: : :
Balanceando uma rvore binria

Baseado na tcnica binria de busca


Armazene os dados em um vetor
Ordene o vetor
Designe para a raiz o elemento do meio
do vetor
Agora o vetor tem duas submatrizes,
refaa o passo 3 e 4 para cada submatriz
at que todos os elementos tenham sido
utilizados
Balanceando uma rvore binria
Baseado na tcnica binria de busca

void balancear (TipoNo dados[], int primeiro, int ultimo,


TipoApontador &p){
if(primeiro <= ultimo) {
int meio = (primeiro + ultimo)/2;
insere(dados[meio],p);
balancear(dados, primeiro, meio-1);
balancear(dados, meio+1, ultimo);
}
}
Balanceando uma rvore binria

Baseado na tcnica binria de busca


Este algoritmo tem um srio inconveniente:
todos os dados precisam ser armazenados em
um vetor antes de construir a rvore.
O algoritmo no muito interessante em
rvores dinmicas pois teramos que destruir
e reconstruir a rvore a cada nova insero.
Neste caso no seria necessrio o uso de
mtodos de ordenao, basta utilizar o percurso
em in-ordem.
Balanceando uma rvore binria

O Algoritmo DSW
Foi idealizado por Colin Day e melhorado por
Quentin F. Stout e Bette L Warren.
O algoritmo DSW (2 passos)
1. Transfigura uma rvore binria arbitrria em uma
rvore parecida com lista ligada (espinha dorsal).
2. Ento, essa rvore alongada transformada em
uma srie de passes em uma rvore perfeitamente
balanceada, girando repetidamente cada segundo
n da espinha dorsal ao redor de seu ascendente.
Balanceando uma rvore binria

O Algoritmo DSW
O essencial para as transformaes de
rvores nesse algoritmo a rotao.
H dois tipos de rotao simtricas
A esquerda
A direita.
Balanceando uma rvore binria
O Algoritmo DSW
A rotao direita do n Ch com relao ao seu ascendente
Par realizada de acordo com o seguinte algoritmo:

RotateRight (Gr, Par, Ch)


if Par no a raiz da rvore //isto e, se Gr no e nulo
o av Gr do filho Ch se torna o ascendente de Chs substituindo Par;
a subrvore direita de Ch se torna a rvore esquerda do ascendente Par de Ch;
o n Ch obtm Par como seu filho direito;

Gr Gr

Par Ch

Ch R P Par

P Q Q R
Balanceando uma rvore binria

Primeira Fase (espinha dorsal)

createBackbone(root, n)
tmp = root;
while (tmp != 0)
if tmp tem um filho esquerdo
gire esse filho ao redor de tmp;
ajuste tmp para o filho que se tornou o ascendente;
else
ajuste tmp para o filho direito;
Balanceando uma rvore binria

Segunda Fase (construindo a rvore)


Em cada passe para baixo na espinha dorsal, cada
segundo n para baixo at um certo ponto girado ao
redor de seu ascendente.

createPerfectTree(n)
m = 2 lg( n 1) 1 ;
faa n-m rotaes comeando do topo da espinha dorsal;
while (m>1)
m = m/2;
faa m rotaes comeando do topo da espinha dorsal;
Balanceando uma rvore binria

Anlise do algoritmo DSW


Criar uma espinha dorsal tem custo mximo
de O(n)
A construo da rvore tem custo de O(n)
O custo de balanceamento global timo
em termos de tempo, porque cresce
linearmente com n e exige uma pequena e
fixa quantidade de armazenagem.
Balanceando uma rvore binria

Exerccio
Crie uma arvore binria de pesquisa
balanceada utilizando o algoritmo
baseado na tcnica binria de busca.
5, 10, 20, 30, 25, 28, 23, 40 ,15
Crie uma arvore binria de pesquisa
balanceada utilizando o algoritmo DSW.
5, 1, 9, 8, 7, 0, 2, 3, 4, 6
Referncia Bibliografia

DROZDEK, Adam. Estrutura de dados e algoritmos em C++. So


Paulo: Thomson, 2002.