Você está na página 1de 10

Estruturas de Informao

rvores AVL
_______________________________________________________________________________________________

RVORES AVL


As rvores binrias de pesquisa so projectadas para um acesso rpido informao.
Idealmente a rvore deve ser razoavelmente equilibrada e a sua altura ser dada (no
caso de estar completa ), como j vimos anteriormente por h=log
2
(n+1) 1, isto de
O(log
2
n), sendo n o nmero total de elementos da rvore. Contudo, com alguns dados, a
rvore binria de pesquisa pode degenerar, tendo no pior caso altura n -1, tornado-se o
acesso muito mais lento, O(n). o que acontece no caso em que a construo da rvore
feita por inseres sucessivas e os valores so dados com chaves ordenadas
(crescentes ou decrescentes).

Assim, vamos analisar um tipo de estrutura que nos d o poder das rvores binrias de
pesquisa, sem ocorrerem as condies do pior caso que esta ltima apresenta.
Estudaremos ento as rvores AVL, em que cada n est equilibrado em altura,
significando isto que, em cada n, a diferena de alturas entre as subrvores esquerda e
direita no mximo 1. Uma outra definio para rvores AVL ser aquela em que para
qualquer n P se verifica que o mdulo do factor de equilbrio sempre < ou = 1.
Entende-se por factor de equilbrio de um n P a diferena da altura da subrvore
esquerda de P e altura da subrvore direita de P.

Factor de Equilbrio(P)= altura(filho_ direito(P))-altura(filho_esquerdo(P))

As rvores abaixo representadas evidenciam o caso da introduo dos valores 1,2,3,4,5
no caso de uma rvore binria de pesquisa e no caso de uma rvore AVL .

rvore Binria de Pesquisa rvore AVL


Se o factor de equilbrio num n negativo, significa que a altura da subrvore esquerda
maior (em 1) do que a altura da subrvore direita, diremos ento que o n pesado
esquerda.
Se o factor de equilbrio num n positivo, significa que a altura da subrvore direita
maior (em 1) do que a altura da subrvore esquerda, diremos ento que o n pesado
direita.
Se o factor de equilbrio num n nulo, significa que a altura da subrvore esquerda
igual altura da subrvore direita, diremos ento que o n equilibrado
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 1
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________


A seguir desenham-se rvores exemplo, em que a cada n se adiciona o respectivo
factor de equilbrio.




Assim na definio da classe Nodo, teremos que considerar, alm dos campos contedo
e os apontadores para as subrvores esquerda e direita, mais um campo designado por
factor_equilibrio que representar o estado de equilbrio de cada n.

Uma rvore AVL ter uma estrutura semelhante a uma rvore binria de pesquisa com a
condio de que a rvore de pesquisa mantm-se equilibrada em altura depois de cada
operao de insero e eliminao.


Algoritmo de Insero
O algoritmo de insero semelhante ao das rvores binrias de pesquisa,
recursivamente descemos ora para a direita ora para a esquerda at atingirmos uma
subrvore nula e ento nessa posio colocaremos a folha com o elemento a inserir.

Nesse processo de descida na rvore, definimos um caminho desde a raiz at posio
de insero do novo n. Uma vez que o processo recursivo, temos acesso aos ns por
ordem inversa ao caminho percorrido e podemos actualizar o factor de equilbrio num n
pai depois de termos estudado o efeito de juntar um novo n numa das subrvores.

Em cada n do caminho percorrido determinamos se ou no necessrio uma
actualizao e somos ento confrontados com 3 situaes.
Em dois dos casos, o novo n mantem o equilbrio da rvore e no necessrio a
reestruturao da subrvore, s o factor de equilbrio exige actualizao.
O terceiro caso desiquilibra a rvore e necessrio realizar uma rotao simples ou
dupla dos ns para fazer o reequilbrio da rvore.

CASO 1: um n no caminho percorrido tem facto de equilbrio 0, depois de juntar o novo
n fica com factor de equilbrio 1 ou 1dependendo em qual das subrvores juntamos o
novo elemento. Consideremos o exemplo abaixo,em que juntamos o n com valor 55 .
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 2
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________
Todos os ns no caminho da descida estavam equilibrados, depois de juntar 55 os
factores de equilbrio foram alterados.


Antes de juntar o n 55 Depois de juntar o n 55



CASO 2: Um n no caminho pesado direita ou esquerda e o novo n colocado na
outra subrvore( a menos pesada), nesse caso o n torna-se equilibrado

Antes de juntar o n 55 Depois de juntar o n 55



Caso 3: Um n no caminho pesado direita ou esquerda e o novo elemento
colocado na mesma subrvore, na mais pesada. O n resultante viola a condio de
rvore AVL, uma vez que o factor de equilbrio ficaria fora da gama de valores 1...1. O
algoritmo obriga-nos a rodar os ns para estabelecer o equilbrio da altura.
Vamos exemplificar e para tal assumimos que a rvore se torna desiquilibrada para a
esquerda e ns ajustamos o equilbrio chamando funes de rotao direita. Os casos
so simtricos quando a rvore se torna desiquilibrada direita.
Vamos ento considerar que o n da rvore AVL tem a seguinte configurao:




dir conteudo Factor_equilibrio
esq
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 3
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________
O algoritmo que conduz insero de um elemento pode ser definido do seguinte modo:

insere( item)
Inicio
rz=raiz
factor_rev=0
novo_no=new AVLNodo(item,0,Nulo,Nulo) // criao do n
Se raiz==Nulo
Entao raiz=novo_no
Seno AVLinsere(rz, novo_no, factor_rev)
// rz e factor_rev so passados por referncia
Fse
Fim


AVLinsere(rz,novo_no,factor_rev)
Inicio
ReeqNoActual=0 // indica se ocorreu alterao no factor de equilbrio do n

Se rz==Nulo
Ento rz=novo_no
rz->factor_equilibrio=0
factor_rev=1
Seno Se novo_no->conteudo < rz->conteudo
Entao // O elemento ser inserido para a esquerda
AVLinsere(rz->esq, novo_no, reeqNoActual)
Se reeqNoActual !=0
Ento //h que actualizar o factor_equilbrio
Se rz->factor_equilibrio==pesado_esq
Ento // CASO 3
actual_esq(rz, factor_rev)
Seno Se rz>factor_equilibrio==equilibrado
Ento // CASO 1
rz->factor_equilibrio=pesado_esq
factor_rev=1
Seno // CASO 2
rz>factor_equilibrio=equilibrado
factor_rev=0
Fse
Fse

Seno factor_rev=0
Fse
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 4
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________




Seno // O elemento ser inserido para a direita
AVLinsere(rz->dir, novo_no, reeqNoActual)
Se reeqNoActual !=0

Ento // h que actualizar o factor_equilbrio
Se rz->factor_equilibrio==pesado_esq

Ento // CASO 2
rz>factor_equilibrio=equilibrado
factor_rev=0


Seno Se rz>factor_equilibrio==equilibrado

Ento // CASO 1
rz->factor_equilibrio=pesado_dir
factor_rev=1

Seno // CASO 3
actual_dir(rz, factor_rev)

Fse
Fse

Seno factor_rev=0
Fse
Fse
Fse
FIM


Vejamos agora o algoritmo que faz a actualizao da subrvore esquerda, ( a da direita
idntico) h que fazer as rotaes dos ns de acordo com os casos de modo a
reequilibrar a rvore. Depois de feito o reequilbrio a flag factor_rev posta a 0 para
notificar o pai de que a subrvore est equilibrada. Os parmetros so passados por
referncia.
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 5
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________

actual_esq (rz, factor_ver)
Inicio
filho=rz->esq
Se filho->factor_equilibrio== pesado_esq
Ento rotaao_simples_dir ( rz )
factor_rev=0

Seno Se filho->factor_equilibrio==pesado_dir
Ento rotaao_dupla_dir ( rz )
factor_rev=0
Fse
Fse
Fim

Vejamos agora como se processam as rotaes.
1-O caso de rotao simples verifica-se ento quando o n pai (P) era pesado
esquerda e o n filho (LC) depois da insero do novo n X, tornou-se pesado tambm
esquerda. Rodamos os ns de modo que o n filho substitua o pai e este por sua vez
torna-se o seu filho direito . O ajuste de apontadores bem visvel na figura abaixo.




Tudo se passaria de modo idntico se actualizassemos a subrvore direita, em que nesse
caso o n pai estava pesado direita e aps a insero do novo n X, o filho direito
ficasse tambm desiquilibrado direita. Nesse caso a rotao ter-se-ia que se verificar
para o lado esquerdo. As alteraes a fazer seria substituir esquerdo por direito e direito
por esquerdo
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 6
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________
Vejamos agora um exemplo concreto, em que se insere o valor 5

rvore inicial Factores de equilibrio rvore aps rotao
depois de juntar 5





Quanto ao algoritmo referente rotao simples direita em que o parmetro passado
por referncia, traduzir-se- no seguinte:

rotaao_simples_dir ( rz )
Inicio
filho=rz->esq
rz->factor_equilibrio=equilibrado
filho->factor_equilibrio=equilibrado

//ajustar apontadores
rz->esq=filho->dir
filho->dir=rz
rz=filho
Fim

2- O caso de rotao dupla direita, verifica-se ento quando o n est pesado
esquerda e o seu filho esquerdo depois da insero do novo elemento se torna pesado
direita. Ter-se- que proceder actualizao dos factores de equilbrio e para isso h que
verificar se o factor de equilbrio do n neto (filho direito do filho esquerdo do n em
questo) , equilibrado, pesado direita ou pesado esquerda para fazer a respectiva
actualizao sendo feito seguidamente o ajuste de apontadores.

As figuras abaixo evidenciam o que se passa, em que a insero do novo n se deu na
subrvore esquerda do neto ou na subrvore direita do neto. Em qualquer dos casos o
neto substitui o av, ficando com o av direita e o pai esquerda. A subrvore direita
do neto passar a ser a esquerda do av e a esquerda do neto ser a direita do pai.


_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 7
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________






A seguir vamos descrever o algoritmo que executa esta dupla rotao direita. De modo
totalmente idntico proceder-se-ia rotao dupla para a esquerda , mtodo esse que
seria invocado no mtodo actualizar subrvore direita que ns no descreveremos uma
vez que seria igual, ao j descrito, actualizar subrvore esquerda, trocando unicamente
os apontadores direitos por esquerdos e vice versa.
O parmetro , que um apontador para n, passado por referncia.
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 8
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________


dupla_rotaao_dir ( rz )
Inicio
filho=rz->esp
neto=filho->dir
Se neto->factor_equilibrio==pesado_dir
Ento rz->factor_equilibrio= equilibrado
filho->factor_equilibrio=pesado_dir

Seno Se neto->factor_equilibrio==equilibrado
Ento rz->factor_equilibrio= equilibrado
filho->factor_equilibrio=equilibrado

Seno rz->factor_equilibrio=pesado_dir
filho->factor _equilibrio=equilibrado
Fse
Fse
neto->factor_equilibrio=equilibrado
filho->dir=neto->esq
neto->esq=filho
rz->esq=neto->dir
neto->dir=rz
rz=neto
Fim

Seguidamente apresenta-se um exemplo com valores para melhor se compreender o foi
descrito.
Neste exemplo, depois de inserir o n com valor 25 , houve necessidade de fazer uma
dupla rotao para a direita.

Antes de inserir 25 Depois de inserir 25 e de rodar



H autores que afirmam que a experincia mostra que 50% das inseres e eliminaes
obrigam a rotaes. Evidentemente que as rotaes conduzem a uma perda de eficincia
nos algoritmos de insero e eliminao. Assim, a utilizao desta estrutura depende das
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 9
Departamento de Eng Informtica
Estruturas de Informao
rvores AVL
_______________________________________________________________________________________________
aplicaes e portanto aplicaes onde a pesquisa seja a operao dominante deve usar-
se rvores AVL, ,j que esta operao garante uma ordem de complexidade log
2
n. Em
aplicaes em que as inseres ou eliminaes so as operaes mais frequentes
poderemos ento usar rvores binrias de pesquisa.
_______________________________________________________________________________
Instituto Superior de Engenharia do Porto 10
Departamento de Eng Informtica

Você também pode gostar