Vous êtes sur la page 1sur 26

Apostila de estrutura de dados.

Apostila de estrutura de dados, disponibilizada a todos que queiram entender como os compiladores alocam
memria dinamicamente.
Eduardo Batisto Pgina 2

Sumrio

Consideraes Gerais......................................................................................................................................... 3
Tipo Apontador (Ponteiro) ................................................................................................................................. 4
Ponteiros no Pascal ........................................................................................................................................ 5
Listas Encadeadas .............................................................................................................................................. 8
Listas Simplesmente Encadeadas.................................................................................................................... 8
Exerccio....................................................................................................................................................... 12
Listas Duplamente Encadeadas ........................................................................................................................ 13
Exerccio....................................................................................................................................................... 15
Filas ................................................................................................................................................................. 16
Exerccio....................................................................................................................................................... 16
Pilhas ............................................................................................................................................................... 17
Exerccios ..................................................................................................................................................... 18
rvores ............................................................................................................................................................ 19
Arvore binria .............................................................................................................................................. 19
rvore ordenada .......................................................................................................................................... 20
Operaes associadas ao TAD rvore binria padro: ................................................................................... 23


Eduardo Batisto Pgina 3

Consideraes Gerais
A automatizao de tarefas um aspecto marcante da sociedade moderna e na cincia da computao houve
um processo de desenvolvimento simultneo e interativo de mquinas (hardware) e dos elementos que
gerenciam a execuo automtica (software) de uma tarefa.
Nesta grande evoluo do mundo computacional, um fator de relevante importncia a forma de armazenar
as informaes, j que, informtica a cincia da informao. Ento de nada adiantaria o grande
desenvolvimento do hardware e do software, se a forma de armazenamento e tratamento da informao no
acompanhasse esse desenvolvimento. Por isso a importncia das estruturas de dados, que nada mais so, que
formas otimizadas de armazenamento e tratamento das informaes eletronicamente.
As estruturas de dados, na sua maioria dos casos, foram espelhadas em formas naturais de armazenamento do
nosso dia a dia, ou seja, nada mais so que a transformao de uma forma de armazenamento j conhecida e
utilizada no nosso munda para o mundo computacional. Por isso, cada tipo de estrutura de dados possui
vantagens e desvantagens e cada uma delas tem sua rea de atuao (massa de dados) tima.
Esta apostila foi elaborada com o objetivo de introduzir o aluno, que j possua um conhecimento da linguagem
Pascal, no mundo das estruturas de dados, bem como mostrar a teoria (conceitos) e a prtica (implementao)
das estruturas de dados mais utilizadas no dia a dia do profissional de informtica.
O aluno at aqui, somente teve contato com estruturas de dados estticas (vetores e matrizes), e deve estar
familizarizado com suas facilidades e dificuldades de uso. Agora novas estruturas de dados sero apresentadas,
sendo que, todas elas sero estruturas de dados dinmicas, ou seja, crescem e diminuem de acordo com a
necessidade, veremos que, para isso, sero necessrias vrias rotinas que controlam esta dinamicidade das
estruturas.

Eduardo Batisto Pgina 4

Tipo Apontador (Ponteiro)
Um das caractersticas mais marcantes do pascal permitir a criao e destruio de variveis durante a
execuo do programa. O uso dessas variveis possibilita a implementao das estruturas de dados dinmicas.
Essas variveis criadas e destrudas durante a execuo do programa so chamadas variveis dinmicas. Uma
varivel dinmica no declarada na parte de declarao de variveis porque esta ainda no existe antes do
seu tempo de execuo, ela no possui sequer um nome, ficando a cargo dos ponteiros desempenharem esta
funo de nome. Uma varivel dinmica sempre referenciada indiretamente por um apontador, ou seja,
para cada varivel dinmica criada deve existir um apontador, que literalmente aponta para ela, permitindo a
sua manipulao.
Caractersticas Gerais.
Os apontadores so declarados como as demais variveis, seguindo a sintaxe da linguagem de programao
utilizada. Eles so variveis que armazenam o endereo de memrias de outras variveis, funcionando assim,
como meio de referenciar uma varivel dinmica, permitindo o acesso a essa varivel. Outra caracterstica dos
apontadores que na sua declarao deve indicar qual o tipo de varivel ir armazenar no endereo.
A principal funo dos ponteiros permitir a criao e a manipulao das variveis dinmicas, as quais iro
compor as estruturas de dados dinmicas.
Eduardo Batisto Pgina 5

Ponteiros no Pascal
Declarao : a sintaxe de declarao de um tipo ponteiro o seguinte.
type identificador = ^tipo; {onde o smbolo ^indica que o identificador um ponteiro}, isso indica que
teremos um ponteiro com o nome de identificador com a capacidade de armazenar o endereo de memria de
uma varivel desse tipo.
Como os ponteiros so utilizados para implementar as estruturas de dados dinmicas, o mais comum que
seja criado um tipo do ponteiro desejado (type) e depois declaramos (var) as variveis ponteiros deste tipo.
Exemplo :
type
Nome : string[35];
PontNome : ^Nome;
Var
nome1,nome2,nome3 : PontNome;

Inicializao : como os ponteiros armazenam endereos de memria, assim que eles so declarados o
seu contedo um valor desconhecido (como as demais variveis), ou seja, no podemos prever para
qual rea de memria este esta apontando, por isso, a linguagem pascal permite que um ponteiro seja
inicializado, da seguinte forma :
Identificador:=nil; {nil um valor constante pode ser armazenado em uma varivel do tipo apontador para
indicar que a varivel no contm endereo de memria de nenhuma varivel dinmica}.
Criao de uma varivel dinmica: para criao de uma varivel dinmica necessrio que exista uma
varivel do tipo apontador para o tipo da varivel que se desaja criar, e ento utiliz-se o procedimento
new, cuja sintaxe a seguinte:
New(identificador); {onde, identificador deve ser uma varivel do tipo ponteiro para o tipo de varivel a ser
criada}.
Obs.: quando uma varivel dinmica criada atravs do procedimento NEW, um espao de memria do
tamanho da varivel criada alocado na memria heap e este espao ficar alocado at ser liberado.
Eduardo Batisto Pgina 6


Destruio de uma varivel dinmica: para que o espao de memria heap seja liberado necessrio que a
varivel dinmica seja destruda, isso pode ser feito atravs do procedimento dispose, utilizando a seguinte
sintaxe;
Dispose (identificador);
Referencia a uma varivel dinmica: quando uma varivel dinmica criada atravs de um ponteiro, este pode
ser utilizado para referenci-la, permitindo a manipulao (leitura, atribuio, escrita, etc), desta varivel como
outra varivel qualquer, para isso devemos utilizar o smbolo ^aps o nome da varivel do tipo ponteiro:
Identificador^
Marcao e liberao de uma rea no heap - mark(ponteiro) e release(ponteiro)
Ex:
program ManipulacaoVariaveisDinamicas;
type
nome =string[30];
ponteiro =^nome;
var
p1, p2 : ponteiro;
begin
new(p1);
new(p2);
readln(p1^);
p2^:='Jos Maria';
p1^:=p1^+' ' +p2^;
writeln(p1^);
end.

Comando para manipulao de ponteiros e pascal:
New(p): Aloca uma rea de memria e guarda seu endereo em p;
Dispose(p): Libera a rea de memria cujo endereo est em p;
Eduardo Batisto Pgina 7

P: O endereo;
p^: O valor armazenado na posio de memria de endereo p;
NIL: Ponteiro que no aponta para nada (NULO);
@A: Endereo de uma varivel.

Eduardo Batisto Pgina 8

Listas Encadeadas
Esta classe de estruturas de dados foi inspirada numa forma de armazenamento bastante comum na nossa vida
cotidiana, pois, desde eras bastante remotas, o homem utiliza-se da ideia de listar coisas com o objetivo de
melhor organiz-las.
Baseado nesse conceito bastante simples (listagem) a estrutura de dados lista foi concebida, onde, cada
elemento da lista armazena uma informao til e uma, ou mais, referencia(s) para outro elemento (limitao
do mundo computacional) e assim por diante, desta forma, com o auxlio dos ponteiros, pode-se acrescentar
ou retirar elementos conforme a necessidade.
Listas encadeadas geralmente so utilizadas para criar vetores de extenso de memria desconhecida, pela sua
caracterstica dinmica, permitindo que o vetor (lista) tenha sempre o tamanho necessrio.
Listas Simplesmente Encadeadas
Este tipo de lista o mais simples e segue as seguintes regras:
Deve existir um ponteiro que aponte para o primeiro elemento da lista (incio da lista);
Cada elemento, ou n, da lista aponta para o prximo sucessivamente (da o nome listas encadeadas)
O ltimo elemento deve apontar para NIL, indicando o final da lista.
Agora podemos definir a estrutura bsica de um n da lista
Representao grfica:







prox
Info

N
Eduardo Batisto Pgina 9


Declarao:

type
apontador=^no;
InfoType=record
campos do registro;
end;

no =record
info : InfoType;
prox : apontador;
end;

Onde, n um registro com dois campos: info e prox, info um tipo registro do tipo infotype contendo as
informaes (variveis) teis e prox um ponteiro capaz de armazenar o endereo de memria de um registro
do tipo n (elemento da lista).
Graficamente a representao de uma lista simplesmente encadeada seria a seguinte:




Onde, INICIO um ponteiro que guarda o endereo de memria do primeiro elemento da lista.


prox Info

N

prox
Info

N
INICIO
Eduardo Batisto Pgina 10

Aplicao

As listas simplesmente encadeadas so utilizadas quando h necessidade de criar vetores com tamanho
varivel (dinmico), sua limitao, somente permitir, o caminhamento unidirecional na lista, pois, como as
referncias iniciam no primeiro elemento da lista e seguem unidirecionalmente at o ltimo elemento, no
possvel regressar no caminhamento atravs da lista.
Mesmo com esta limitao, as listas simplesmente encadeadas so largamente utilizadas, pela sua simplicidade
de implementao fornecendo um bom ndice entre custo/benefcio, na gerncia, em memria, de conjuntos
de dados no muito extensos.
Exemplo de utilizao, cadastro e listagem dos elementos inseridos.
Program ExemploLista ;
Uses Crt;
{ Exemplo criado para teste com listas simplesmente encadeada
Ateno: Note que o a varivel tipo ponteiro "P" foi criada
diversas vezes com o New(P), e as variveis tambm do
tipo ponteiro Inicio e Prximo no foram, isso ocorreu pois
quando declaramos uma varivel do tipo ponteiro ele j
aloca um espao em memria, note que utilizaremos elas apenas
para guardar o inicio da lista e o prximo elemento, no
utilizaremos elas para mais nada, diferente do P que cria todos
os ns, e logo aps os percorre mostrando os valores que ele est
apontando no determinado momento.
}
// Cria um tipo de dados ponteiro para o tipo registro
Type
Ponteiro =^Registro;

// Cria o tipo registro
Registro =Record
Nome, Endereco: String;
Idade: integer;
Prox: Ponteiro; // Elo de ligao da lista
end;

Var
P, Inicio, Proximo: Ponteiro;
Tmp: String[1]; // exemplificar uma string com tamanho determinado, mas poderia ser char

Begin
New(P);
Inicio:=P;
P^.Prox:=Nil;
Writeln('Escreva o nome');
Eduardo Batisto Pgina 11

ReadLn(P^.Nome);
Writeln('Escreva o Endereco');
ReadLn(P^.Endereco);
Writeln('Escreva a idade');
ReadLn(P^.Idade);

Writeln('Deseja cadastrar mais um?');
ReadLn(Tmp);

While Tmp ='S' do
Begin
proximo:=p;
New(p);
Proximo^.Prox:=P;
Writeln('Escreva o nome');
ReadLn(P^.Nome);
Writeln('Escreva o Endereco');
ReadLn(P^.Endereco);
Writeln('Escreva a idade');
ReadLn(P^.Idade);
P^.Prox:=Nil;
Writeln('Deseja cadastrar mais um?');
ReadLn(Tmp);
end;

P:=Inicio;

While P^.prox <>nil do
Begin
Writeln('---------------');
Writeln(P^.Nome);
Writeln(P^.Endereco);
Writeln(P^.Idade);
P:=P^.Prox;
End;
Writeln('---------------');
Writeln(P^.Nome);
Writeln(P^.Endereco);
Writeln(P^.Idade);
readln();
End.
Eduardo Batisto Pgina 12

Exerccio
Faa uma agenda eletrnica que utilize os seguintes campos: cdigo, nome, endereo, telefone e uma
observao, que permita todas as operaes de cadastro (incluso, consulta, alterao e excluso). Esta agenda
dever utilizar listas simplesmente encadeadas.

Eduardo Batisto Pgina 13

Listas Duplamente Encadeadas
uma lista encadeada, onde cada elemento contm um ponteiro para o n anterior e um ponteiro para o n
posterior, permitindo o caminhamento nos dois sentidos da lista, diferentemente, da lista simplesmente
encadeada, que s permitia em um nico sentido.
Aplicao

Aplicao das listas duplamente encadeadas semelhante as listas simplesmente encadeadas, mas aquela
mais apropriada, quando h a necessidade de caminhamento em ambos os sentidos, isso faz com que, novas
sub-rotinas sejam utilizadas nas listas duplamente encadeadas, tais como : Anterior, Posterior.
Operaes Bsicas (Incluso, Pesquisa, Alterao, Excluso, Anterior e Posterior).
Anterior - dever retornar o endereo do n anterior ou NIL, caso no exista anterior.
Exemplo de utilizao de insero, e navegao entre os elementos:
Program ExemploListaDuplamenteEncadeada ;
Uses Crt;

// Cria um tipo de dados ponteiro para o tipo registro
Type
Ponteiro =^Registro;

// Cria o tipo registro
Registro =Record
Nome, Endereco: String;
Idade: integer;
Prox, Ant: Ponteiro; // Elo de ligao das listas
end;
Var
P, Pont, inicio: Ponteiro;
Tmp: String[1]; // exemplificar uma string com tamanho determinado, mas poderia ser char
op: integer;

Begin
New(P);
Inicio:=P;
P^.Prox:=Nil;
P^.Ant:=Nil;

Writeln('Escreva o nome');
ReadLn(P^.Nome);
Writeln('Escreva o Endereco');
Eduardo Batisto Pgina 14

ReadLn(P^.Endereco);
Writeln('Escreva a idade');
ReadLn(P^.Idade);

Writeln('Deseja cadastrar mais um?');
ReadLn(Tmp);

While upcase(Tmp) ='S' do
Begin
Pont:=p;
New(p);
Pont^.Prox:=P;
Writeln('Escreva o nome');
ReadLn(P^.Nome);
Writeln('Escreva o Endereco');
ReadLn(P^.Endereco);
Writeln('Escreva a idade');
ReadLn(P^.Idade);
P^.Prox:=Nil;
p^.Ant:=Pont;

Writeln('Deseja cadastrar mais um?');
ReadLn(Tmp);
end;

p:=inicio;

While P^.prox <>nil do
Begin
Writeln('---------------');
Writeln(P^.Nome);
Writeln(P^.Endereco);
Writeln(P^.Idade);
P:=P^.Prox;
End;
Writeln('---------------');
Writeln(P^.Nome);
Writeln(P^.Endereco);
Writeln(P^.Idade);

Writeln('--------------- Inverso --------------');

While P^.ant <>nil do
Begin
Writeln('---------------');
Writeln(P^.Nome);
Writeln(P^.Endereco);
Writeln(P^.Idade);
P:=P^.ant;
Eduardo Batisto Pgina 15

End;

Writeln('---------------');
Writeln(P^.Nome);
Writeln(P^.Endereco);
Writeln(P^.Idade);

Writeln('Escreva uma opo 2 - Proximo, 1 - Anterior');
Readln(op);

If op =2 then
if P^.prox <>nil then
Begin
P:=P^.Prox;
Writeln(P^.Nome);
Writeln(P^.Endereco);
Writeln(P^.Idade);
end;

If op =1 then
if P^.Ant <>nil then
Begin
P:=P^.Ant;
Writeln(P^.Nome);
Writeln(P^.Endereco);
Writeln(P^.Idade);
end;

readln;
End.


Exerccio
Utilizando a agenda criada anteriormente, acrescente a possibilidade de listagem do inicio para o final e do
final para o incio.
Eduardo Batisto Pgina 16

Filas

Uma fila uma lista linear de informao que acessada na seguinte ordem, o primeiro que entra, primeiro
que sai (FIFO). Uma fila no permite acesso a um elemento que no seja o primeiro.
Aplicao

Normalmente as filas so utilizadas na administrao de recursos compartilhados, impondo uma prioridade por
ordem de chegada. Um bom exemplo so as filas de impresso, onde, cada documento espera sua vez para ser
impresso.

Operaes Bsicas (Incluso Enqueue e Excluso Dequeue).
Partindo da palavra em ingls queue que significa fila, so denominadas duas operaes bsicas suportadas
pelas filas:
Enqueue: Insere elemento no final da fila.
Dequeue: Remove elemento do comeo da fila.
Exerccio
Com base no exerccio de listas simplesmente encadeada, construa dois mtodos que implemente as funes
ENQUEUE Insere elemento no final da fila, e DEQUEUE remove elemento do comeo da fila.

Eduardo Batisto Pgina 17

Pilhas
Anlogo estrutura fila, a estrutura pilha tambm pr-define a posio de insero e remoo dos elementos,
sendo que, a estratgia ltimo que entra, primeiro que sai (LIFO).
So um tipo de lista onde todas as operaes de insero e remoo, so feitas na mesma extremidade (Topo).
O primeiro a entrar o ltimo a sair e o ltimo a entrar o primeiro a sair (LIFO Last-In First-Out).
Trata-se de uma estrutura dinmica (pode aumentar ou diminuir durante a existncia).

Aplicao

Um bom exemplo da aplicao das pilhas a gerencia das chamadas as sub-rotinas utilizadas pela maioria dos
compiladores das linguagens de programao.
Operaes bsicas suportadas.
Top: Acessa o elemento localizado no topo da Pilha P.
Pop: Remove e retorna o elemento posicionado no topo da Pilha P (diminui o tamanho da pilha).
Eduardo Batisto Pgina 18

Push: Acrescenta o elemento X no topo da Pilha P (aumenta o tamanho da pilha).
Exerccios
Com base no exerccio de listas duplamente encadeada, construa os trs mtodos que implemente as funes
Top: Acessa o elemento localizado no topo da pilha, Pop: Remove e retorna o elemento posicionado no topo
da pilha, Push: Acrescenta o elemento X no topo da pilha.

Eduardo Batisto Pgina 19

rvores
rvores so estruturas de dados essencialmente dinmicas, permitindo a insero, pesquisa e destruio de
elementos.
rvores trazem, implicitamente, a idia de hierarquia, por isso so estruturas de dados muito utilizadas em
gerenciamento de arquivos e validao de expresses.
Uma rvore pode ser definida de vrias formas. Talvez, a maneira mais natural defini-las recursivamente.
Assim, uma rvore composta por um conjunto de ns. Existe um n denominado raiz, que contm zero ou
mais sub-rvores e cada sub-rvore pode ser considerada uma rvore.
Arvore binria
Formalmente uma rvore binria pode ser definida como um conjunto finito de ns, que vazio, ou consiste
de um n raiz e dois conjuntos disjuntos de ns, a subrvore esquerda e a subrvore direita.
Uma rvore estritamente binria uma rvore binria em que cada n tem 0 ou 2 filhos.
Uma rvore binria cheia uma rvore em que se um n tem alguma sub-rvore vazia ento ele est no ltimo
nvel.
Uma rvore completa aquela em se n um n com algumas de subrvores vazias, ento n se localiza no
penltimo ou no ltimo nvel.
Portanto, toda rvore cheia completa e estritamente binria.
Eduardo Batisto Pgina 20

rvore ordenada
Uma rvore chamada ordenada quando a ordem das subrvores significante.


Partes que compem uma rvore completa:
Raiz - o n de mais alto nvel da rvore (primeiro n da rvore).
Nvel - O nmero de ns que vai da raiz at um determinado n.
Grau - O nmero de sub-rvores de um n.
Folha - N com grau igual a zero.
Altura - Nvel mais alto da rvore.
Pai - A raiz de uma sub-rvore pai das razes de suas sub-rvores.
Filho - Os ns razes de uma sub-arvores filho da raiz da rvore.
Irmo - Ns razes das sub-rvores so irmos.
Dada a rvore:
Eduardo Batisto Pgina 21


Pai e filho: Um n y abaixo de um n x chamado filho de x. x dito pai de y. Exemplo: B pai de E e F.
Irmo: Ns com o mesmo pai so ditos irmos. Exemplo: B, C, D so irmos.
Nvel de um n: A raiz de uma rvore tem nvel 1. Se um n tem nvel i, seus filhos tm nvel i +1. Exemplo: E,
F, G e H tm nvel 3.
Altura ou profundidade de uma rvore: o mximo nvel de seus ns. A rvore do exemplo tem altura 4.
Folha ou n terminal: um n que no tem filhos. Exemplo: I, J, K, L so folhas.
N interno ou n no terminal: um n que no folha.
Grau de um n: o nmero de filhos do n. Exemplo: B tem grau 2, G tem grau 1.
Grau de uma rvore: o mximo grau de seus ns. A rvore do exemplo tem grau 3.
Usando a nomenclatura vista, podemos definir que a rvore binria....
rvore binria: uma rvore ordenada de grau 2.
Exemplo


Eduardo Batisto Pgina 22




Uma rvore Binria T um conjunto finito de elementos denominados ns ou vrtices, tal que:
T =0 e a rvore dita vazia ou existe um n especial r, chamado raiz de T, os restantes podem ser divididos em
dois subconjuntos disjuntos, Tre e Trd, que so as subrvores esquerda e direita de r, respectivamente e as
quais, por sua vez, tambm so rvores binrias.
Definio da Estrutura de Dados
Type
PNo = ^no;
no = r ecor d
i nf o: Tel em;
esq, di r : PNo;
End;

Type t r ee: PNo;

Eduardo Batisto Pgina 23



Operaes associadas ao TAD rvore binria padro:
Definir uma rvore vazia
Criar um n raiz
Verificar se rvore vazia ou no
Criar um filho direita de um dado n
Criar um filho esquerda de um dado n
Verificar qual o nvel de um dado n
Retornar o pai de um dado n
Definir uma rvore vazia

Definir uma rvore vazia deve ser utilizado antes de qualquer outro.

Pr ocedur e Def i ne( var t : t r ee) ;
Begi n
t : =ni l ;
End;

Criar um n raiz

Retorna o n raiz da rvore em t

Pr ocedur e Cr i a_Rai z( var t : t r ee; i t em: Tel em) ;
Var no: t r ee;
Begi n
new( n) ;
no^. esq: =ni l ;
no^. di r : =ni l ;
no^. i nf o: =i t em;
t : =no;
End;

Verificar se rvore vazia ou no

Retorna true se rvore vazia, false.

Funct i on Vazi a ( t : t r ee) : bool ean;
Begi n
vazi a: =( t =ni l ) ;
Eduardo Batisto Pgina 24

End;

Criar um filho direita de um dado n
Busca elemento contendo Item_Pai
Se Item_Pai ainda no possui filho direita, ento cria um filho sua direita com o contedo de item.
Pr ocedur e Adi ci onar _Di r ( t : t r ee; i t em_pai , i t em: Tel em)
Var pai ,
no: t r ee;
Begi n
pai : =Local i za( t , i t em_pai ) ;
I f ( pai <>ni l ) Then
I f ( pai ^. di r <>ni l ) Then
er r o( "i t emj possui subr vor e di r ei t a")
El se
Begi n
New( n) ;
no^. esq: =ni l ;
no^. di r : =ni l ;
no^. i nf o: =i t em;
pai ^. di r : =n;
End;
End;

Criar um filho esquerda de um dado n

Pr ocedur e Adi ci onar _Di r ( t : t r ee; i t em_pai , i t em: Tel em)
Var pai ,
no: t r ee;
Begi n
pai : =Local i za( t , i t em_pai ) ;
I f ( pai <>ni l ) Then
I f ( pai ^. esq<>ni l ) Then
er r o( "i t emj possui subr vor e di r ei t a")
El se
Begi n
New( n) ;
no^. esq: =ni l ;
no^. di r : =ni l ;
no^. i nf o: =i t em;
pai ^. esq: =n;
End;
End;

Verificar qual o nvel de um dado n.
Retorna o nvel onde est um n com item pesquisado
Se item no existe retorna zero
Funct i on N vel ( t : t r ee; i t em: Tel em) : i nt eger ;
Var n: i nt eger ;
achou: bool ean;

Pr ocedur e Tr avessi a ( pt r : t r ee; VAR ni v: i nt eger ; i t em: Tel em; VAR achou: bool ean) ;
Begi n
Eduardo Batisto Pgina 25

I f pt r <>ni l Then
Begi n
ni v: =ni v+1;
I f I gual ( pt r ^. i nf o, i t em) Then
achou: =TRUE;
El se
Begi n
Tr avessi a( pt r ^. esq, ni v, i t em, achou) ;
I f ( NOT achou) t hen
Tr avessi a( pt r ^. di r , ni v, i t em, achou) ;

I f ( NOT achou) Then

ni v: =ni v- 1;
End;
End;
End;

Begi n {n vel }
achou: = f al se;

n: = 0;
Tr avessi a( t , n, i t em, achou) ;
ni vel : =n;
End;

Retornar o pai de um dado n
Dado um item, procura se item existe na rvore .
Caso positivo retorna o contedo do pai do n.
Funct i on Pai ( t : t r ee; i t em: Tel em) : Tel em;
Var achou: bool ean;
i t : Tel em;

Pr ocedur e Tr avessi a( t : t r ee; i t em: Tel em; var i t : Tel em; var achou: Bool ean) ;
Begi n
I f not Vazi a( t ) Then
Begi n
I f t ^. esq<>ni l Then
I f I gual ( i t em, t ^. esq^. i nf o) Then
Begi n
achou: =t r ue;
i t : =t ^. i nf o;
End;
I f not achou Then
I f t ^. di r <>ni l Then
I f I gual ( i t em, t ^. di r ^. i nf o) Then
Begi n
achou: =t r ue;
i t : =t ^. i nf o;
End;
I f not achou Then
Tr avessi a( t ^. esq, i t em, i t , achou) ;
I f not achou Then
Tr avessi a( t ^. di r , i t em, i t , achou) ;
End;
End; {Tr avessi a}
Eduardo Batisto Pgina 26


Begi n {pai }
I f not Vazi a( t ) Then
Begi n
achou: =f al se;
I f I gual ( i t em, t ^. i nf o) Then
pai : =t ^. i nf o; {pai do r ai z el e pr pr i o}
El se
Begi n
Tr avessi a( t , i t em, i t , achou) ;
pai : =i t ;
End;
End;
End;

Vous aimerez peut-être aussi