Escolar Documentos
Profissional Documentos
Cultura Documentos
rvores em PROLOG
A
Edmilson Marmo Moreira
Universidade Federal de Itajub
a - UNIFEI
Instituto de Engenharia de Sistemas e Tecnologias da Informac
ao - IESTI
Considerac
oes Iniciais
Arvores
sao esruturas de dados que caracterizam uma relacao entre os dados que
a compoem. Esta relacao existente entre os dados, denominados nos, e uma relacao de
hierarquia ou de composicao, onde um conjunto de dados e hierarquicamente subordinado
a outro.
Formalmente, uma arvore e um conjunto finito T de um ou mais nos, tais que:
1. existe um no denominado raiz da arvore;
2. os demais nos formam m 0 conjuntos disjuntos S1 , S2 , , Sm , onde cada um
destes conjuntos e uma arvore. As arvores Si (1 i n) recebem a denominacao
de subarvores.
Esquematicamente, uma arvore pode ser representada como mostra a figura 1.
GFED
@ABC
o A PPPP
o
o
PPP
ooo
PPP
ooo
PPP
o
o
o
PPP
o
P
ooo
o
GFED
@ABC
GFED
@ABC
GFED
@ABC
C@
D
B
@
~
@
~
@@
~~
@@
~~
@@
~
~
~
GFED
@ABC
GFED
@ABC
GFED
@ABC
GFED
@ABC
89:;
?>=<
89:;
?>=<
~~
~~
~
~~
~~
HA
J
AA
AA
AA
AA
GFED
@ABC
Arvores
Bin
arias
Arvores
binarias sao estruturas do tipo arvore, onde o grau de cada no e menor ou
igual a dois. No caso de arvores binarias, distinguem-se as subarvores de um no entre
subarvore esquerda e subarvore direita. Assim, se o grau de um no for igual a 1, deve
ser especificado se a sua subarvore e a da esquerda ou a da direita. Uma arvore binaria
tambem pode ser vazia, isto e, nao possuir nenhum no. A figura 2 apresenta um exemplo
de arvore binaria.
GFED
@ABC
~~
~~
~
~~
~~
GFED
@ABC
~~
~~
~
~~
~~
GFED
@ABC
@@
@@
@@
@@
GFED
@ABC
~~
~~
~
~~
~~
GFED
@ABC
E@
@@
~
~
@@
~~
@@
~
~
@@
~
~~
GFED
@ABC
A@
C@
@
@@
@@
@@
@
GFED
@ABC
GFED
@ABC
comida).
telefone).
aluguel).
loja).
Objetos compostos permitem que se acrescente maiores detalhes `as clausulas. O que
segue e um exemplo utilizando a informacao recem-apresentada:
pagar(maria,
pagar(maria,
pagar(maria,
pagar(maria,
comida(sanduiche, 23.40)).
telefone(celular, 100.00)).
aluguel(apartamento, 400.00)).
loja(brinquedos, 25.00)).
arvore(nil, A, nil)
Figura 3: Arvore
apos a insercao do no A
arvore(
A@
@@
@@
@@
@@
nil
|{z}
subarvoreEsquerda
, A, arvore(nil, C, nil) )
{z
}
|
subarvoreDireita
GFED
@ABC
Figura 4: Arvore
apos a insercao do no C
GFED
@ABC
~~
~~
~
~~
~~
GFED
@ABC
A@
@@
@@
@@
@@
subarvoreEsquerda
subarvoreDireita
GFED
@ABC
Figura 5: Arvore
apos a insercao do no B
Construc
ao de Arvores
Bin
arias
Utiliza-se uma forma sequencial dos nos na arvore afim de facilitar o processo de
construcao. Um mecanismo muito utilizado e conhecido como Notacao Ponto. Nesta
notacao, os elementos da arvore aparecem em ordem pre-fixada e um ponto representa
uma arvore vazia. A figura 6 ilustra o exemplo de uma arvore e sua representacao neste
tipo de notacao. Observa-se que, pela posicao do ponto, nao existe duas cadeias de
caracteres diferentes para representar a mesma arvore.
GFED
@ABC
~
~~
~
~
~~
~~
GFED
@ABC
B
~ @@@
~
@@
~
~
@@
~~
@@
~
~
~
GFED
@ABC
ABC..D.EF....
GFED
@ABC
D@
@@
@@
@@
@@
GFED
@ABC
~
~~
~
~
~~
~~
GFED
@ABC
Figura 6: Arvore
binaria e respectiva notacao ponto
A seguir tem-se o exemplo de um programa simples em Turbo Prolog para construir
uma arvore a partir da respectiva notacao ponto. Este programa obtem do dispositivo de
entrada padrao as informacoes que serao inseridas na arvore.
/*
* Constr
oi Arvore
Caminhamentos em Arvores
Bin
arias
Caminhar uma arvore significa percorrer todos os nos da arvore de forma sistematica
de modo que cada no seja visitado uma u
nica vez. O caminhamento pode ser realizado
por profundidade ou por largura.
O caminhamento por profundidade apresenta tres formas basicas:
1. Caminhamento pre-fixado (pre-ordem), que realiza a seguinte sequencia de passos:
(a) Processa o no;
(b) Percorre a subarvore esquerda;
(c) Percorre a subarvore direita.
2. Caminhamento central (ordem intermediaria), que realiza a seguinte sequencia de
passos:
(a) Percorre a subarvore esquerda;
(b) Processa o no;
(c) Percorre a subarvore direita.
3. Caminhamento pos-fixado (pos-ordem), que realiza a seguinte sequencia de passos:
(a) Percorre a subarvore esquerda;
GFED
@ABC
~~
~~
~
~~
~~
GFED
@ABC
~~
~~
~
~~
~~
GFED
@ABC
D@
@@
@@
@@
@@
A@
@@
@@
@@
@@
GFED
@ABC
~~
~~
~
~~
~~
GFED
@ABC
E@
@@
@@
@@
@@
GFED
@ABC
GFED
@ABC
Figura 7: Arvore
binaria
O codigo Prolog a seguir apresenta predicados para realizar os tres tipos de caminhamento em profundidade discutidos. A acao de processar o noe realizada apresentando
o conte
udo do no no dispositivo de sada padrao.
/*
* Caminhamentos em profundidade primeiro
*/
Domains
arvore=arvore(arvore, symbol, arvore); nil
Predicates
MostraPreOrdem(arvore).
MostraInOrdem(arvore).
MostraPosOrdem(arvore).
Clauses
MostraPreOrdem(nil).
Arvore
Bin
aria de Busca
A estrutura de dados arvore e boa para a manutencao ordenada dos dados. Assim,
se for utilizado o criterio de que dados maiores devem ser inseridos no ramo direito e
dados menores devem ser inseridos no ramo esquerdo, a arvore estara sempre ordenada.
Nesta situacao, o caminhamento em ordem intermediaria apresentara os dados em ordem
crescente.
O codigo a seguir apresenta um predicado para inserir um no em um arvore binaria
de busca.
/*
* Inser
c~
ao em
Arvore Bin
aria de Busca
*/
Domains
arvore=arvore(arvore, symbol, arvore); nil
Predicates
InsereNo(symbol, arvore, arvore).
Clauses
InsereNo(X, nil, arvore(nil, X, nil)).
InsereNo(X, arvore(Esq, X, Dir), arvore(Esq, X, Dir)).
nil), Esq) :- !.
Dir), arvore(Esq, Y, Dir1)) :- !,
Dir), arvore(Esq1, Y, Dir)) :- X < Y, !,
Dir), arvore(Esq, Y, Dir1)) :- X > Y, !,
Exerccios
1. Montar um predicado Prolog que identifique o nvel de um determinado no de uma
arvore binaria.
2. Escrever um predicado para substituir todas as ocorrencias de um determinado
elemento em uma arvore binaria.
3. Escrever um predicado que retorne a altura de uma arvore binaria.
4. Escrever um predicado que verifique se duas arvores sao equivalentes.
5. Desenvolver predicados para realizar as seguintes rotacoes em uma arvore binaria:
(a) Rotacao Esquerda;
(b) Rotacao Direita;
(c) Rotacao Esquerda e Direita;
(d) Rotacao Direita e Esquerda.
6. Desenvolva um predicado para inserir um elemento em uma arvore AVL.
Refer
encias
CLOCKSIN, W. F.; MELLISH, C. S. Programming in Prolog. Berlin: Springer-Verlag,
1984.
MONARD, M. C.; NICOLETTI, M. do C. Tecnicas avancadas de programacao prolog