Você está na página 1de 261

estruturas de dados

as autoras
Nina Edelweiss engenheira eletricista e doutora em Cincia da Computao
pela UFRGS. Atualmente professora colaboradora do Instituto de Informti-
ca da mesma universidade, onde atua como professora e orientadora do Pro-
grama de Ps-Graduao em Cincia da Computao. Durante muitos anos
lecionou em cursos de engenharia e no bacharelado em Cincia da Computa-
o na UFRGS, na PUCRS e na UFSC. co-autora de trs livros, tendo publica-
do diversos artigos em peridicos e em anais de congressos internacionais e
nacionais. Desenvolve pesquisas na rea de banco de dados, com nfase em
bancos de dados temporais e com verses.

Renata Galante tem doutorado em Cincia da Computao pela UFRGS e


professora adjunta no Instituto de Informtica. Est envolvida com atividades
de extenso, ensino de graduao e ps-graduao e orientao de alunos de
mestrado e doutorado. Tem trabalhado em diversos projetos de pesquisa fi-
nanciados por agncias de fomento como CNPq, Finep e Fapergs. autora de
diversos artigos cientficos em peridicos e anais de conferncia. co-editora
da Revista de Iniciao Cientfica da SBC. Desenvolve pesquisa nas reas de
banco de dados, XML, teoria de banco de dados, semntica de linguagens de
consulta, sistemas de informao e sistemas na web.

E21e Edelweiss, Nina.


Estruturas de dados [recurso eletrnico] / Nina Edelweiss,
Renata Galante. Dados eletrnicos. Porto Alegre :
Bookman, 2009.

Editado tambm como livro impresso em 2009.


ISBN 978-85-7780-450-4

Estruturas de dados. 2. Tipos de dados. 3. rvores. 4.


rvores binrias. I. Galante, Renata. II. Ttulo.

CDU 004.422.63

Catalogao na publicao: Renata de Souza Borges CRB-10/Prov-021/08


nina edelweiss
renata galante

estruturas de dados

2009
Artmed Editora SA, 2009

Leitura final: Monica Stefani

Superviso editorial: Arysinha Jacques Affonso

Capa e projeto grfico: Tatiana Sperhacke TAT studio

Imagem de capa: iStockphoto.com/Alexey Khlobystov

Editorao eletrnica: Techbooks

Reservados todos os direitos de publicao, em lngua portuguesa,


ARTMED EDITORA S.A.
(BOOKMAN COMPANHIA EDITORA uma diviso da ARTMED EDITORA S.A.)
Av. Jernimo de Ornelas, 670 - Santana
90040-340 Porto Alegre RS
Fone (51) 3027-7000 Fax (51) 3027-7070

proibida a duplicao ou reproduo deste volume, no todo ou em parte,


sob quaisquer formas ou por quaisquer meios (eletrnico, mecnico, gravao,
fotocpia, distribuio na Web e outros), sem permisso expressa da Editora.

SO PAULO
Av. Anglica, 1.091 - Higienpolis
01227-100 So Paulo SP
Fone (11) 3665-1100 Fax (11) 3667-1333

SAC 0800 703-3444

IMPRESSO NO BRASIL
PRINTED IN BRAZIL
apresentao

A Srie Livros Didticos do Instituto de Informtica da Universidade Federal do


Rio Grande do Sul tem como objetivo a publicao de material didtico para
disciplinas ministradas em cursos de graduao em Computao e Inform-
tica, ou seja, para os cursos de Bacharelado em Cincia da Computao, de
Bacharelado em Sistemas de Informao, de Engenharia da Computao e de
Licenciatura em Informtica. A srie desenvolvida tendo em vista as Diretri-
zes Curriculares do MEC e resultante da experincia dos professores do Insti-
tuto de Informtica e dos colaboradores externos no ensino e na pesquisa.

Os primeiros ttulos, Fundamentos da Matemtica Intervalar e Programando


em Pascal XSC (esgotados), foram publicados em 1997 no mbito do Projeto
Aritmtica Intervalar Paralela (ArInPar), financiados pelo ProTeM - CC CNPq/
Fase II. Essas primeiras experincias serviram de base para os volumes sub-
seqentes, os quais se caracterizam como livros-texto para disciplinas dos
cursos de Computao e Informtica.

Em seus ttulos mais recentes, a Srie Livros Didticos tem contado com a
colaborao de professores externos que, em parceria com professores do
Instituto, esto desenvolvendo livros de alta qualidade e valor didtico. Hoje a
srie est aberta a qualquer autor de reconhecida capacidade.

O sucesso da experincia com esses livros, aliado responsabilidade que


cabe ao Instituto na formao de professores e pesquisadores em Compu-
tao e Informtica, conduziu ampliao da abrangncia e institucio-
nalizao da srie.

Em 2008, um importante passo foi dado para a consolidao e ampliao de


todo o trabalho: a publicao dos livros pela Artmed Editora S.A., por meio
vi Apresentao

do selo Bookman. Hoje so 15 os ttulos publicados uma lista completa,


incluindo os prximos lanamentos, encontra-se nas orelhas desta obra am-
pliando a oferta aos leitores da srie. Sempre com a preocupao em manter
nvel compatvel com a elevada qualidade do ensino e da pesquisa desenvolvi-
dos no mbito do Instituto de Informtica da UFRGS e no Brasil.

Prof. Paulo Blauth Menezes


Comisso Editorial da Srie Livros Didticos
Instituto de Informtica da UFRGS
prefcio

Este livro o resultado da experincia acumulada pelas autoras ao longo de


vrios anos ministrando a disciplina Estruturas de Dados nos cursos de Ba-
charelado em Cincia da Computao e de Engenharia da Computao da
Universidade Federal do Rio Grande do Sul (UFRGS).

O livro tem por objetivo servir de base para o ensino das estruturas de dados
listas e rvores em nvel de graduao na rea de Computao e Infor-
mtica. O contedo do livro adequado para uma disciplina de um semestre,
sendo assumido o conhecimento prvio de tcnicas de desenvolvimento de
algoritmos. No so feitas anlises de complexidade dos algoritmos nem de
sua otimizao: a clareza dos algoritmos priorizada, para facilitar sua com-
preenso.

O contedo est de acordo com a proposta de Currculo de Referncia da


Sociedade Brasileira de Computao (SBC) para cursos de graduao na rea
de Computao e Informtica. A disciplina Estruturas de Dados um dos
assuntos tratados nos Fundamentos de Computao, e consta do currculo
dos cursos de Bacharelado em Cincia da Computao e de Engenharia da
Computao. Nesta proposta, o contedo de Estruturas de Dados com-
preende:

Listas lineares e suas generalizaes: listas ordenadas, listas encadeadas,


pilhas e filas. Aplicaes de listas. rvores e suas generalizaes: rvores
binrias, rvores de busca, rvores balanceadas (AVL), rvores B e B+.
Aplicaes de rvores.

Somente o estudo de rvores B e B+ no foi includo neste livro, por tratar


de armazenamento em memria secundria, assunto que no est sendo
viii Prefcio

tratado aqui. Todos os algoritmos apresentados consideram o armazenamen-


to dos dados em memria principal. Com base no objetivo de servir de base
para uma disciplina de um semestre, no haveria tempo hbil para incluir
mais este assunto (memria secundria) com todos os seus desdobramentos.
Fica a sugesto de que este assunto seja tratado em uma disciplina posterior,
nomeada no Currculo de Referncia de Pesquisa e Ordenao.

Uma apostila editada em 2000 por Santos e Edelweiss, seguindo exatamente


a seqncia das aulas ministradas na UFRGS, serviu de base para este livro.
Nela, os textos simplesmente descreviam as lminas projetadas nas aulas. Os
contedos aqui apresentados so mais abrangentes. O mesmo conjunto de
operaes bsicas detalhado para cada uma das estruturas analisadas, pas-
svel de ser ampliado e adaptado para diferentes aplicaes.

As autoras agradecem aos professores, monitores e alunos das aulas da dis-


ciplina de Estruturas de Dados, ministrada no Departamento de Informtica
Aplicada do Instituto de Informtica da UFRGS, que utilizaram o material,
apontaram problemas e propuseram melhorias.

Muito do que aqui apresentado se deve s aulas de Clesio Saraiva dos San-
tos, excelente mestre e querido amigo, nosso professor em momentos dife-
rentes de nossas trajetrias acadmicas. A ele devemos ter despertado em ns
o interesse por esta rea de pesquisa, o prazer pelo desafio de desenvolver
um algoritmo elegante e correto, a alegria gratificante de transmitir novos
conhecimentos aos nossos alunos.

Nina Edelweiss
Renata Galante
sumrio

1 introduo 29

1.1 pr-requisitos........................................................................31
1.2 estrutura do texto.................................................................31

2 conceitos bsicos 35
2.1 tipos de dados e estruturas de dados ..................................36
2.2 tipos abstratos de dados ......................................................37
2.3 alternativas de representao fsica .....................................41
2.3.1 contigidade fsica ........................................................ 41
2.3.2 encadeamento............................................................... 43
2.3.3 representao fsica mista ............................................. 44

2.4 exerccios ..............................................................................44

3 listas lineares 49
3.1 listas lineares implementadas atravs de
contigidade fsica ...............................................................53
3.1.1 criao de uma lista linear vazia .................................... 55
3.1.2 insero de um novo nodo ............................................ 56
3.1.3 remoo de um nodo .................................................... 63
3.1.4 acesso a um nodo.......................................................... 65
10 Sumrio

3.2 listas lineares implementadas por contigidade


fsica com descritor...............................................................69
3.2.1 criao de uma lista linear vazia com descritor .............. 71
3.2.2 insero de um novo nodo ............................................ 73
3.2.3 remoo de um nodo .................................................... 77
3.2.4 acesso a um nodo.......................................................... 78

3.3 listas lineares com ocupao circular do arranjo .................80


3.3.1 criao de uma lista linear vazia .................................... 80
3.3.2 insero de um novo nodo ............................................ 80
3.3.3 remoo de um nodo .................................................... 83
3.3.4 acesso a um nodo.......................................................... 85

3.4 listas lineares encadeadas ....................................................88


3.4.1 criao de uma lista linear encadeada ........................... 89
3.4.2 insero de um novo nodo ............................................ 90
3.4.3 remoo de um nodo .................................................... 95
3.4.4 acesso a um nodo.......................................................... 96
3.4.5 destruio de uma lista linear encadeada ...................... 97

3.5 lista encadeada circular ........................................................98


3.5.1 insero de um novo nodo ............................................ 99
3.5.2 remoo de um nodo .................................................. 100
3.5.3 acesso a um nodo........................................................ 102

3.6 listas lineares duplamente encadeadas ..............................102


3.6.1 insero de um novo nodo .......................................... 104
3.6.2 remoo de um nodo .................................................. 106
3.6.3 acesso lista duplamente encadeada .......................... 107
3.6.4 lista duplamente encadeada, com descritor ................ 108

3.7 lista duplamente encadeada circular..................................110


3.7.1 insero de um novo nodo .......................................... 111
3.7.2 remoo de um novo nodo ......................................... 112
3.7.3 lista duplamente encadeada circular, com descritor .... 113

3.8 consideraes gerais...........................................................115


3.9 exerccios ............................................................................117
Sumrio 11

4 pilhas e filas 125

4.1 pilhas ..................................................................................126


4.1.1 pilhas implementadas por contigidade fsica ............. 128
criao da pilha .........................................................................129
insero de um nodo na pilha ....................................................130
remoo de um nodo da pilha ...................................................131
acesso pilha ............................................................................131
4.1.2 pilhas implementadas por encadeamento ................... 132
criao de pilha encadeada ........................................................133
insero de um nodo em pilha encadeada .................................133
remoo de um nodo em pilha encadeada.................................134
acesso pilha encadeada...........................................................135
destruio de uma pilha encadeada ...........................................136

4.2 filas .....................................................................................137


4.2.1 filas implementadas por contigidade fsica ................ 137
criao de uma fila ....................................................................140
insero de um nodo em uma fila ..............................................140
remoo de um nodo de uma fila ..............................................141
acesso a uma fila .......................................................................142
4.2.2 filas implementadas por encadeamento ...................... 143
criao da fila encadeada...........................................................144
insero de um nodo na fila encadeada .....................................144
remoo de um nodo da fila encadeada ....................................145
acesso a uma fila encadeada ......................................................145
destruio de uma fila encadeada ..............................................146

4.3 fila dupla deque ...............................................................147


4.3.1 filas duplas implementadas por contigidade fsica .... 148
criao de uma fila dupla ...........................................................148
insero de um nodo em uma fila dupla ....................................149
remoo de um nodo de uma fila dupla.....................................150
acesso a uma fila dupla..............................................................151
4.3.2 filas duplas encadeadas ............................................... 151
criao de uma fila dupla encadeada .........................................152
insero de um nodo em fila dupla encadeada ...........................153
remoo de um nodo da fila dupla encadeada ...........................154
acesso a uma das extremidades da fila dupla encadeada ............155
12 Sumrio

4.4 exerccios ............................................................................156

5 rvores 167
5.1 conceitos bsicos ................................................................168
5.1.1 terminologia ................................................................ 170
5.1.2 operaes sobre rvores .............................................. 174

5.2 rvores implementadas atravs de contigidade fsica .....176


5.2.1 implementao por nveis............................................ 177
5.2.2 implementao por profundidade ............................... 178
5.2.3 vantagens e desvantagens da implementao por
contigidade fsica ...................................................... 178

5.3 rvores implementadas por encadeamento.......................180


5.3.1 operaes bsicas ........................................................ 181
5.3.2 vantagens e desvantagens da implementao por
encadeamento............................................................. 182

5.4 exerccios ............................................................................182

6 rvores binrias 189


6.1 transformao de rvore n-ria em binria........................192
6.2 operaes sobre rvores binrias .......................................194
6.2.1 criao de uma rvore vazia ........................................ 195
6.2.2 insero de um novo nodo .......................................... 195
6.2.3 remoo de um nodo .................................................. 197
6.2.4 acesso aos nodos ......................................................... 199
percurso atravs de diferentes caminhamentos ..........................202
operaes de acesso implementadas atravs de algoritmos
recursivos ..................................................................................207
6.2.5 destruio de uma rvore ............................................ 208
Sumrio 13

6.3 exemplos de aplicaes que utilizam rvores binrias.......209


6.3.1 construo de uma rvore ........................................... 209
6.3.2 montagem de uma lista a partir de uma rvore ........... 211
6.3.3 clculo do valor de uma expresso aritmtica ............. 212

6.4 rvores binrias de pesquisa ..............................................214


6.4.1 insero de um novo nodo .......................................... 216
6.4.2 remoo de nodo ........................................................ 219
6.4.3 acesso a um nodo........................................................ 223

6.5 rvores balanceadas ...........................................................225


6.5.1 rvores balanceadas por altura AVL .......................... 226
operaes de rotao ................................................................228
insero de um novo nodo ........................................................237
6.5.2 rvores balanceadas por freqncia ............................ 238

6.6 exerccios ............................................................................241

anexo 249

leituras recomendadas 255

ndice 259
lista de algoritmos

Algoritmo 3.1 InicializarLLArr Criao de lista linear


implementada sobre um arranjo 56

Algoritmo 3.2 InserirIniLLArr Insero de um nodo no incio de


uma lista linear implementada sobre um arranjo 58

Algoritmo 3.3 InserirFimLLArr Insero de um nodo no final de


uma lista linear implementada sobre um arranjo 60

Algoritmo 3.4 InserirLLArrPosK Insero de um nodo na


posio "k" de uma lista linear implementada sobre um
arranjo 62

Algoritmo 3.5 InserirLLArrPosKOt Insero de um nodo na


posio "k" de uma lista linear implementada sobre um
arranjo, otimizado 63

Algoritmo 3.6 RemoverKLLArr Remoo do nodo na posio "k"


de uma lista linear implementada sobre um arranjo 64

Algoritmo 3.7 AcessarKLLArr Acesso ao nodo na posio "k" de


uma lista linear implementada sobre um arranjo 66

Algoritmo 3.8 PosValLLArr Posio do nodo identificado por


seu valor, em uma lista linear implementada sobre um
arranjo 67

Algoritmo 3.9 PosValLLArrOrd Posio do nodo identificado


por seu valor, em uma lista linear implementada sobre
um arranjo, ordenada 69
16 Lista de Algoritmos

Algoritmo 3.10 InicLLArrDescr Inicializao do descritor de uma


lista linear implementada sobre um arranjo 72

Algoritmo 3.11 InserirLLArrDesc Insero de um nodo em


uma lista linear implementada sobre um arranjo, com
descritor 75

Algoritmo 3.12 RemoverKLLArrDesc Remoo do nodo na


posio "k" em uma lista linear implementada sobre um
arranjo, com descritor 77

Algoritmo 3.13 AcessarKLLArrDesc Acesso ao nodo na posio


"k" de uma lista linear implementada sobre um arranjo,
com descritor 78

Algoritmo 3.14 PosValLLArrDesc Posio do nodo identificado


por seu valor, em uma lista linear implementada sobre
um arranjo, com descritor 79

Algoritmo 3.15 InserirLLCirArrPosK Insero de um nodo na


posio "k" de uma lista linear circular implementada
sobre um arranjo 82

Algoritmo 3.16 RemoverKLLCirArr Remoo do nodo na


posio "k" de uma lista linear circular implementada
sobre um arranjo 84

Algoritmo 3.17 AcessarKLLCirArr Acesso ao nodo na posio


"k" de uma lista linear circular implementada sobre um
arranjo 86

Algoritmo 3.18 PosValLLCirArr Posio do nodo identificado


por seu valor, em uma lista linear circular implementada
sobre um arranjo 87

Algoritmo 3.19 InicializarLLEnc Criao de lista linear


encadeada 80

Algoritmo 3.20 InserirIniLLEnc Insero de um nodo no incio de


uma lista linear encadeada 91
Lista de Algoritmos 17

Algoritmo 3.21 InserirFimLLEnc Insero de um nodo no final de


uma lista linear encadeada 92

Algoritmo 3.22 InserirKLLEnc Insero de um nodo na posio


"k" de uma lista linear encadeada 94

Algoritmo 3.23 RemoverKLLEnc Remoo do nodo na posio


"k" em uma lista linear encadeada 96

Algoritmo 3.24 AcessarKLLE Acesso ao nodo na posio "k" de


uma lista linear encadeada 97

Algoritmo 3.25 DestruirLLEnc Destruio de uma lista linear


encadeada 97

Algoritmo 3.26 InserirKLLEncCir Insero de um nodo na


posio "k" de uma lista linear encadeada circular 99

Algoritmo 3.27 RemoverKLLEncCir Remoo do nodo na


posio "k" de uma lista linear encadeada circular 101

Algoritmo 3.28 ImprimirLLEncCir Imprime o contedo de todos


os nodos de uma lista linear encadeada circular 102

Algoritmo 3.29 InserirKLLDupEnc Insero de um nodo na posio


"k" de uma lista linear duplamente encadeada 104

Algoritmo 3.30 RemoverKLLDupEnc Remoo do nodo na posio


"k" de uma lista linear duplamente encadeada 107

Algoritmo 3.31 ImprimirLLDupEncInv Imprime o contedo dos


nodos de uma lista linear duplamente encadeada, do
final para o incio 108

Algoritmo 3.32 InserirFimLLDupEncDesc Insero de um nodo


no final de uma lista linear duplamente encadeada, com
descritor 109

Algoritmo 3.33 InserirFimLLDupEncCir Insero de um nodo


no final de uma lista linear duplamente encadeada
circular 111
18 Lista de Algoritmos

Algoritmo 3.34 RemoverUltLLDupEncCir Remoo do ltimo


nodo de uma lista linear duplamente encadeada
circular 113

Algoritmo 3.35 AcessarKLLDupEncCirDesc Acesso ao nodo na


posio "k" de uma lista linear duplamente encadeada
circular, com descritor 114

Algoritmo 4.1 InicializarPilhaArr Criao de uma pilha


implementada sobre um arranjo 130

Algoritmo 4.2 InserirPilhaArr Insero de um nodo em uma


pilha implementada sobre um arranjo 130

Algoritmo 4.3 RemoverPilhaArr Remoo de um nodo de uma


pilha implementada sobre um arranjo 131

Algoritmo 4.4 ConsultarPilhaArr Acesso ao nodo do topo de


uma pilha implementada sobre um arranjo 132

Algoritmo 4.5 CriarPilhaEnc Criao de uma pilha encadeada


133

Algoritmo 4.6 InserirPilhaEnc Insero de um nodo em uma


pilha encadeada 134

Algoritmo 4.7 RemoverPilhaEnc Remoo de um nodo de uma


pilha encadeada 134

Algoritmo 4.8 ConsultarPilhaEnc Consulta ao nodo do topo de


uma pilha encadeada 135

Algoritmo 4.9 Desempilhar Consulta ao nodo do topo de uma


pilha encadeada, com remoo deste nodo 136

Algoritmo 4.10 DestruirPilhaEnc Destruio de uma pilha


encadeada 136

Algoritmo 4.11 InicializarFilaArr Criao de uma fila


implementada sobre um arranjo 140
Lista de Algoritmos 19

Algoritmo 4.12 InserirFilaArr Insero de um nodo em uma fila


implementada sobre um arranjo 141

Algoritmo 4.13 RemoverFilaArr Remoo de um nodo de uma


fila implementada sobre um arranjo 142

Algoritmo 4.14 ConsultarFilaArr Acesso ao nodo do incio de


uma fila implementada sobre um arranjo 142

Algoritmo 4.15 CriarFilaEnc Criao de uma fila


encadeada 144

Algoritmo 4.16 InserirFilaEnc Insero de um nodo em uma fila


encadeada 144

Algoritmo 4.17 RemoverFilaEnc Remoo de um nodo de uma


fila encadeada 145

Algoritmo 4.18 ConsultarFilaEnc Consulta ao nodo do incio de


uma fila encadeada 146

Algoritmo 4.19 DestruirFilaEnc Destruio de uma fila


encadeada 146

Algoritmo 4.20 InicializarDequeArr Criao de uma fila dupla


implementada sobre um arranjo 149

Algoritmo 4.21 InserirIniDequeArr Insero de um nodo no incio


de uma fila dupla implementada sobre um arranjo 149

Algoritmo 4.22 RemoverFimDequeArr Remoo de um nodo


do final de uma fila dupla implementada sobre um
arranjo 150

Algoritmo 4.23 ConsultarMaiorDequeArr Funo que devolve


o maior dos dois valores contados nas extremidades de
uma fila dupla implementada sobre um arranjo 151

Algoritmo 4.24 CriarDequeEnc Criao de uma fila dupla


encadeada 152
20 Lista de Algoritmos

Algoritmo 4.25 InserirDequeEnc Insero de um nodo em uma


das extremidades de uma fila dupla encadeada 153

Algoritmo 4.26 RemoverDequeEnc Remoo de um nodo em uma


das extremidades de uma fila dupla encadeada 154

Algoritmo 4.27 ConsultarDequeEnc Consulta a um nodo de uma


das extremidades de uma fila dupla encadeada 155

Algoritmo 6.1 CriarArvore Criao de uma rvore binria 195

Algoritmo 6.2 AlocarRaiz Alocao do nodo raiz de uma rvore


binria 196

Algoritmo 6.3 InserirFilhoEsq Insero de um nodo como


descendente esquerda em uma rvore binria 197

Algoritmo 6.4 RemoverFolha Remoo de uma folha de uma


rvore binria 198

Algoritmo 6.5 PrefixadoEsq Percurso de uma rvore binria em


caminhamento prefixado esquerda 204

Algoritmo 6.6 Localizar(Funo) Funo que localiza um nodo


em uma rvore binria 204

Algoritmo 6.7 Ps-FixadoEsq Percurso de uma rvore binria


em caminhamento ps-fixado esquerda 206

Algoritmo 6.8 PrefixadoEsqRec Algoritmo recursivo para


percurso de uma rvore binria em caminhamento
prefixado esquerda 207

Algoritmo 6.9 Ps-FixadoEsqRec Algoritmo recursivo para


percurso de uma rvore binria em caminhamento ps-
fixado esquerda 208

Algoritmo 6.10 CentralEsqRec Algoritmo recursivo para percurso


de uma rvore binria em caminhamento central
esquerda 208
Lista de Algoritmos 21

Algoritmo 6.11 ConstruirArv Construo de uma rvore binria


210

Algoritmo 6.12 FazerListaDeArv Construo de uma lista a partir


de uma rvore binria 212

Algoritmo 6.13 ValorEA(Funo) Funo que calcula o valor de


uma expresso aritmtica 213

Algoritmo 6.14 InserirABP(Funo) Funo que insere um nodo


em uma rvore Binria de Pesquisa (ABP) 217

Algoritmo 6.15 RemoverABP Algoritmo que remove um nodo de


uma ABP 222

Algoritmo 6.16 BuscarABP(Funo) Funo que procura um


nodo com uma determinada chave em uma ABP 224

Algoritmo 6.17 BuscarABPRec(Funo) Funo recursiva de


busca de um nodo com determinada chave em ABP
224

Algoritmo 6.18 RotaoDireitaAVL Algoritmo para realizar


rotao direita em uma rvore AVL 229

Algoritmo 6.19 RotaoEsquerdaAVL Rotao esquerda em


rvore AVL 231

Algoritmo 6.20 RotaoDuplaDireitaAVL Rotao dupla


direita em rvore AVL 234

Algoritmo 6.21 RotaoDuplaEsquerdaAVL Rotao dupla


esquerda em rvore AVL 236

Algoritmo 6.22 InserirAVL Insero de um novo nodo em uma


rvore AVL 237
lista de figuras

Figura 3.1 Lista linear 50

Figura 3.2 Lista linear implementada atravs de contigidade fsica 53

Figura 3.3 Lista linear utilizando parte de um arranjo 54

Figura 3.4 Vrias listas lineares implementadas sobre um mesmo


arranjo 55

Figura 3.5 Insero no incio de uma lista, com deslocamento 57

Figura 3.6 Insero no incio de uma lista, sem deslocamento 58

Figura 3.7 Insero no final de uma lista, com deslocamento 59

Figura 3.8 Insero no meio de uma lista linear 61

Figura 3.9 Remoo do k-simo nodo de uma lista linear 65

Figura 3.10 Descritor para uma lista linear implementada por


contigidade fsica 70

Figura 3.11 Estratgias para representar uma lista vazia 72

Figura 3.12 Insero no incio de lista, com descritor 73

Figura 3.13 Insero no incio de lista, com descritor 74

Figura 3.14 Insero no final de lista, com descritor 74

Figura 3.15 Insero no final de lista com descritor, com


deslocamento 75
24 Lista de Figuras

Figura 3.16 Ocupao circular do arranjo 80

Figura 3.17 Insero no meio de uma lista, com ocupao circular do


arranjo 81

Figura 3.18 Lista encadeada 89

Figura 3.19 Insero no incio de uma lista encadeada 91

Figura 3.20 Insero no final de uma lista encadeada 92

Figura 3.21 Insero no meio de uma lista encadeada 93

Figura 3.22 Remoo de um nodo de uma lista linear encadeada 95

Figura 3.23 Lista encadeada circular 98

Figura 3.24 Lista duplamente encadeada 103

Figura 3.25 Insero de um novo nodo em uma lista duplamente


encadeada 104

Figura 3.26 Remoo de um nodo de uma lista duplamente


encadeada 106

Figura 3.27 Lista duplamente encadeada, com descritor 109

Figura 3.28 Lista duplamente encadeada circular 110

Figura 3.29 Insero no final de uma lista duplamente encadeada


circular 112

Figura 3.30 Lista duplamente encadeada circular, com descritor 114

Figura 4.1 Pilha 127

Figura 4.2 Exemplo de manipulao de uma pilha 128

Figura 4.3 Pilha implementada por encadeamento 133

Figura 4.4 Fila 137

Figura 4.5 Exemplo de manipulao de uma fila 138


Lista de Figuras 25

Figura 4.6 Ocupao circular do arranjo pela fila 139

Figura 4.7 Descritor para uma fila 143

Figura 4.8 Fila dupla (Deque) 147

Figura 5.1 Representao grfica de uma rvore 168

Figura 5.2 Hierarquia de especializao 169

Figura 5.3 Hierarquia de composio 169

Figura 5.4 Hierarquia de dependncia 169

Figura 5.5 Outras formas de representar uma rvore 170

Figura 5.6 Raiz de uma rvore e seus descendentes 171

Figura 5.7 Subrvores da raiz A 172

Figura 5.8 Exemplo de floresta 173

Figura 5.9 rvores ordenadas 174

Figura 5.10 rvores implementadas atravs de contigidade fsica 177

Figura 5.11 rvore ternria implementada atravs de contigidade


fsica 179

Figura 5.12 rvore implementada atravs de encadeamento 180

Figura 6.1 Tipos de rvores binrias 190

Figura 6.2 rvore binria implementada atravs de contigidade


fsica 191

Figura 6.3 rvore binria implementada atravs de encadeamento 192

Figura 6.4 Representao de uma rvore n-ria atravs de uma


binria 193

Figura 6.5 Representao de uma floresta de rvores n-rias atravs de


uma binria 194
26 Lista de Figuras

Figura 6.6 Caminhamentos para percorrer uma rvore binria 200

Figura 6.7 rvore binria: raiz e subrvores 201

Figura 6.8 rvore binria representando uma expresso aritmtica 202

Figura 6.9 Ordem de valores para gerar rvore com caminhamento


prefixado esquerda 210

Figura 6.10 Lista linear montada a partir de rvore binria 211

Figura 6.11 Exemplo de rvore Binria de Pesquisa 214

Figura 6.12 Insero de dois novos nodos na ABP 216

Figura 6.13 Ordem de insero dos nodos em uma ABP e rvores


resultantes 218

Figura 6.14 Remoo de uma folha em uma ABP 219

Figura 6.15 Remoo de nodo de derivao com uma subrvore, em


ABP 220

Figura 6.16 Remoo de nodo de derivao com duas subrvores, em


ABP caso 1 221

Figura 6.17 Remoo de nodo de derivao com duas subrvores, em


ABP caso 2 221

Figura 6.18 ABP desbalanceada 225

Figura 6.19 ABP com fator de balanceamento FB(k) representado em


cada nodo 226

Figura 6.20 Rotao simples direita em rvore AVL 228

Figura 6.21 Exemplo de rotao simples direita 229

Figura 6.22 Rotao simples esquerda 230

Figura 6.23 Exemplo de rotao simples esquerda 231

Figura 6.24 Rotao dupla direita seqncia de rotaes 232


Lista de Figuras 27

Figura 6.25 Rotao dupla direita 233

Figura 6.26 Exemplo de rotao dupla direita 233

Figura 6.27 Rotao dupla esquerda seqncia de rotaes 235

Figura 6.28 Rotao dupla esquerda 235

Figura 6.29 Exemplo de rotao dupla esquerda 236

Figura 6.30 Caminho ponderado mnimo em rvores binrias 239

Figura 6.31 Construo de rvore com caminho ponderado mnimo pelo


algoritmo de Huffman 240
captulo
1
introduo

A representao dos valores manipulados por uma


aplicao pode ser feita por diferentes estruturas de dados.
As principais linguagens de programao oferecem um elenco
de tipos primitivos, como inteiro (para valores inteiros), real
(para valores fracionrios), lgico (para valores booleanos) e
caractere (para representar caracteres). Oferecem, ainda, alguns
tipos estruturados para representar conjuntos de valores, como
arranjos (tambm denominados de vetores e matrizes),
registros, conjuntos e seqncias.
30 Estruturas de Dados

Entretanto, os tipos estruturados presentes nas linguagens de programao


tm grandes limitaes quando se quer representar estruturas de dados mais
complexas, que envolvem diferentes tipos e associaes entre eles. Para tor-
nar os programas mais eficientes, surgiu a necessidade de serem definidas es-
truturas de dados mais apropriadas, com a definio de operaes eficientes
para cada uma delas.

Neste livro so analisadas duas estruturas de dados que, embora muito co-
muns em programas de aplicao, no so fornecidas diretamente pelas lin-
guagens de programao: listas lineares e rvores. Elas so compostas
por conjuntos de elementos onde so armazenadas as informaes, deno-
minados nodos. O que as diferencia entre si o relacionamento lgico entre
estes nodos: nas listas lineares o relacionamento de ordem; nas rvo-
res, existe um relacionamento de subordinao.

Para cada uma destas estruturas sero analisadas formas de organizar os da-
dos, como armazenar fisicamente a estrutura, e algoritmos que implementam
as principais operaes para sua manipulao.

O objetivo deste livro servir como apoio a disciplinas de Estruturas de


Dados em cursos de graduao em Cincia da Computao. No se preten-
de, de modo algum, esgotar a anlise destas estruturas de dados. Para um
estudo mais aprofundado dos assuntos apresentados o leitor deve consultar
as leituras recomendadas. importante ressaltar que considerada somente
a representao de informaes em memria principal. Tcnicas de armaze-
namento em memria secundria so tratadas em outra(s) disciplina(s), como
Organizao de Arquivos.
Captulo 1 Introduo 31

1.1 pr-requisitos
Para acompanhar este livro so necessrios os seguintes conhecimentos
prvios:

programao bsica, utilizando alguma linguagem de programao pro-


cedimental (Pascal, C, Fortran, );
alm da utilizao de variveis simples, o conhecimento de estruturas pre-
sentes nas linguagens de programao, como arranjos e registros;
utilizao de ponteiros e de alocao dinmica de variveis.

1.2 estrutura do texto


Os demais captulos deste livro esto estruturados como segue.

No captulo 2 so brevemente apresentados alguns conceitos bsicos, ne-


cessrios para o desenvolvimento do restante do texto. Inicialmente visto o
conceito de Tipos Abstratos de Dados, utilizado em linguagens de programa-
o e como uma das bases para as estruturas estudadas a seguir. Todos os al-
goritmos apresentados utilizam este conceito, o que facilita a sua implemen-
tao. Em seguida so analisadas duas formas para armazenar fisicamente
as estruturas vistas a seguir. Em cada uma delas sero analisadas estas duas
formas de armazenamento fsico.

A partir do captulo seguinte so detalhadas duas estruturas de dados que


tm larga utilizao em problemas de aplicao. So analisadas as diferentes
formas de armazenamento fsico e as operaes bsicas que podem ser exe-
cutadas sobre elas, com apresentao dos algoritmos correspondentes.

O captulo 3 detalha a estrutura particular denominada Lista Linear. Filas e


pilhas, tipos particulares de listas com limitaes na disciplina de acesso, so
analisadas no captulo 4.

O captulo 5 introduz a estrutura denominada rvore. Um tipo particular


denominado rvore binria detalhado no captulo 6. rvores Binrias de
Pesquisa e rvores AVL, tipos especiais de rvores binrias, so tambm ana-
lisadas neste captulo.
32 Estruturas de Dados

No final de cada captulo apresentada uma lista de exerccios suge-


ridos, agrupados por assunto, finalizando com algumas aplicaes.

Todos os algoritmos ao longo do texto so escritos na pseudolinguagem


apresentada no Anexo.

Finalmente, as leituras recomendadas renem alguns livros disponveis no Bra-


sil, que podem complementar os conceitos aqui apresentados. Selecionamos
somente livros em portugus, com exceo de trs (Aho 1983, Knuth 1968 e
Knuth 1973) que influenciaram a maior parte das pesquisas em estruturas de
dados realizadas ao longo dos ltimos anos.
captulo
???????? 2
conceitos ???????
bsicos

Neste captulo so
apresentados
?????????????????????????
alguns conceitos
necessrios ao entendimento das diferentes??????????????????
estruturas a serem
vistas neste livro. Em primeiro lugar feita a distino entre tipos
de dados e estruturas de dados, sendo em seguida introduzidos os
Tipos Abstratos de Dados, utilizados nos algoritmos apresentados
ao longo de todo o livro. Por fim, so analisadas diferentes
alternativas para a representao fsica das estruturas a serem
estudadas sem, no entanto, entrar em detalhes de implementao.
36 Estruturas de Dados

2.1 tipos de dados e estruturas de dados


Uma aplicao em Cincia da Computao basicamente um programa de
computador que manipula dados. A representao dos dados manipulados
por uma aplicao pode ser feita por diferentes estruturas de dados. Um
fator que determina o papel dessas estruturas no processo de programao
de aplicaes a identificao de quo bem as estruturas de dados coinci-
dem com o domnio do problema a ser tratado. Portanto, essencial que as
linguagens de programao tenham suporte a uma variedade de tipos e es-
truturas, para que representem adequadamente os dados manipulados pelas
aplicaes. Embora os termos tipos de dados e estruturas de dados sejam
semelhantes, eles tm significados diferentes.

Um tipo de dado consiste da definio do conjunto de valores (denominado


domnio) que uma varivel pode assumir ao longo da execuo de um pro-
grama e do conjunto de operaes que podem ser aplicadas sobre ele. Por
exemplo, o tipo de dado inteiro pode assumir valores inteiros (negativos,
zero, positivos), como <..., -2, -1, 0, 1, 2,...>; as operaes pos-
sveis sobre este tipo de dado so: soma, subtrao, multiplicao, diviso,
entre outras. As principais linguagens de programao oferecem uma grande
variedade de tipos de dados, classificados em bsicos e estruturados.

Os tipos de dados bsicos, tambm denominados tipos primitivos,


no possuem uma estrutura sobre seus valores, ou seja, no possvel de-
compor o tipo primitivo em partes menores. Os tipos bsicos so, portanto,
indivisveis. Por exemplo, uma varivel do tipo lgico somente pode assumir
os valores verdadeiro e falso. As principais linguagens de programao
oferecem um elenco de tipos primitivos, como inteiro (para valores intei-
ros), real (para valores fracionrios), lgico (para valores booleanos) e ca-
ractere (para representar caracteres).

Os tipos de dados estruturados permitem agregar mais do que um va-


lor em uma varivel, existindo uma relao estrutural entre seus elementos.
As linguagens de programao oferecem mecanismos para estruturar dados
complexos, quando esses dados so compostos por diversos campos. Os
principais tipos de dados estruturados fornecidos pelas linguagens de pro-
gramao so: arranjos (tambm denominados vetores e matrizes, utiliza-
dos para agregar componentes do mesmo tipo, com um tamanho mximo
predefinido), registros (para agregar componentes de tipos diferentes),
Captulo 2 Conceitos Bsicos 37

seqncias (para colees ordenadas de componentes do mesmo tipo) e


conjuntos (para definir, para um tipo bsico, uma faixa de valores que seus
componentes podem assumir), entre outros.

Existem ainda os tipos de dados definidos pelo usurio. So tambm


tipos de dados estruturados, construdos hierarquicamente atravs de com-
ponentes, os quais so de fato tipos de dados primitivos e/ou estruturados.
Um tipo definido pelo usurio constitudo por um conjunto de compo-
nentes, que podem ser de tipos diferentes, agrupados sob um nico nome.
Normalmente, os elementos desse tipo estruturado tm alguma relao
semntica. Essa construo hierrquica de tipos a maneira fornecida pe-
las linguagens de programao para estruturar os dados e manipul-los de
forma organizada.

Dentro desse contexto surgem as estruturas de dados que, por sua vez, es-
pecificam conceitualmente os dados, de forma a refletir um relacionamento
lgico entre os dados e o domnio de problema considerado. Alm disso, as
estruturas de dados incluem operaes para manipulao dos seus dados,
que tambm desempenham o papel de caracterizao do domnio de proble-
ma considerado. Cabe lembrar que esse nvel conceitual de abstrao no
fornecido diretamente pelas linguagens de programao, as quais fornecem
os tipos de dados e os operadores que permitem a construo de uma estru-
tura de dados flexvel para o problema que est sendo definido. A forma mais
prxima de implementao de uma estrutura de dados atravs dos tipos
abstratos de dados, apresentados na prxima seo.

2.2 tipos abstratos de dados


Os tipos abstratos de dados (TADs) so estruturas de dados capazes
de representar os tipos de dados que no foram previstos no ncleo das lin-
guagens de programao e que, normalmente, so necessrios para aplica-
es especficas. Essas estruturas so divididas em duas partes: os dados e as
operaes. A especificao de um TAD corresponde escolha de uma boa
maneira de armazenar os dados e definio de um conjunto adequado de
operaes para atuar sobre eles.

A caracterstica essencial de um TAD a separao entre conceito e imple-


mentao, ou seja, existe uma distino entre a definio do tipo e a sua
38 Estruturas de Dados

representao, e a implementao das operaes. Um TAD , portanto, uma


forma de definir um novo tipo de dado juntamente com as operaes que
manipulam esse novo tipo de dado. As aplicaes que utilizam esse TAD so
denominadas clientes do tipo de dado.

Como exemplo, um tipo de dados interessante e do qual necessitamos fre-


qentemente o tipo Data. Seguidamente precisamos fazer clculos envol-
vendo datas e nem sempre isto fcil. Por exemplo, quantos dias existem
entre 24 de abril e 2 de fevereiro? Apesar de ser possvel efetuar este clculo,
ele no trivial, j que os meses tm nmero de dias diferentes. Assim, pare-
ce uma boa idia implementar um TAD para Data.

Formalmente, um TAD pode ser definido como um par (v,o), onde v repre-
senta um conjunto de valores e o representa o conjunto de operaes apli-
cveis sobre esses valores. Por exemplo, um TAD para representar uma data
pode ser dado pelo par (v,o), onde:

v uma tripla formada por dia-ms-ano; e


o so as operaes aplicveis sobre o tipo data, como verificar se uma
data vlida, calcular o dia da semana de uma determinada data, calcular
a data do Carnaval de um determinado ano, entre outras.

Uma vez que o TAD foi caracterizado, o prximo passo escolher sua estru-
tura de representao, ou seja, a estrutura de dados propriamente dita que
ir suportar as operaes definidas. A representao ser uma coleo de
campos primitivos ou mesmo uma estrutura complexa formada por vrios
campos primitivos. Considerando o TAD Data, podemos criar uma estrutura
com trs campos do tipo inteiro para representar, respectivamente, o dia, o
ms e o ano, como mostrado a seguir:

Data = registro
Dia: inteiro
Ms: inteiro
Ano: inteiro
fim registro

Alm da estrutura de dados, a representao do TAD envolve a especifica-


o de um conjunto de funes e procedimentos que podem ser executados
Captulo 2 Conceitos Bsicos 39

sobre esse novo tipo de dado. Por exemplo, podemos definir as seguintes
operaes aplicveis sobre o TAD Data:

Procedimento InicializaData
Entradas: Dia, Ms, Ano (inteiro)
Sada: D(Data)
Funo que recebe trs parmetros inteiros, informando Dia, Ms e Ano, e
retorna D, inicializado na data resultante;

Funo AcrescentaDias
Entradas: D (Data), Dias (inteiro)
Retorno: (Data)
Soma um determinado nmero de Dias a uma data recebida como pa-
rmetro e retorna o resultado. Caso a operao no seja possvel, retorna
uma data cujo dia seja -1;

Funo EscreveExtenso
Entrada: D (Data)
Retorno: (lgico)
Recebe uma data e a escreve por extenso. Por exemplo: 10/03/2007 deve
ser escrito como 10 de maro de 2007. Retorna verdadeiro se a opera-
o foi realizada com sucesso e falso, caso contrrio.

A representao do TAD , portanto, composta pela definio da estru-


tura de dados e pela especificao das operaes aplicveis sobre ele. Em
linguagens de programao essa representao denominada de inter-
face do TAD. A visibilidade da estrutura interna do tipo fica limitada s
operaes que so explicitamente especificadas na interface como export-
veis, agregando a idia de ocultamento das informaes. O cliente do TAD
recebe a especificao da estrutura de dados e do conjunto de operaes,
mas a implementao permanece invisvel e inacessvel. O cliente do TAD
tem acesso somente forma abstrata do tipo, com base simplesmente nas
funcionalidades oferecidas pelo tipo. A forma como ele foi implementado
torna-se um detalhe de implementao, que no deve interferir no uso do
TAD em outros contextos. Essa separao entre a definio do TAD e sua
implementao permite que alteraes de implementao no influam nas
aplicaes que utilizam o TAD.
40 Estruturas de Dados

Aps a especificao do TAD e a associao de suas operaes poss-


vel implementar as operaes definidas para o TAD. Cabe lembrar que a
caracterstica essencial separar o conceito da implementao. Os TADs
so geralmente implementados em linguagens de programao atravs do
conceito de bibliotecas. A implementao das operaes propriamente
dita feita em um arquivo separado, sendo que qualquer alterao na im-
plementao dessas operaes implica somente na compilao do mdulo
envolvido.

Por fim, basta somente fazer a ligao da interface e da implementao com


as aplicaes do usurio para gerar um programa executvel. Cabe novamen-
te salientar que a forma de implementao das operaes no deve alterar
o TAD, ou seja, a implementao das funes e dos procedimentos pode
ser alterada e recompilada, mantendo as aplicaes em funcionamento sem
alterao.

Em resumo, um TAD especifica um conjunto de operaes e a semntica


dessas operaes (o que elas fazem). Essa especificao denominada tipo
abstrato. A implementao propriamente dita das operaes denomina-
da tipo concreto. As aplicaes que utilizam esse TAD so denominadas
clientes do tipo de dado. Deste modo, duas importantes vantagens so
identificadas na utilizao do conceito de TADs: (1) a possibilidade de sua
utilizao em diversas aplicaes diferentes; e (2) a possibilidade de alterar o
tipo sem alterar as aplicaes que o utilizam.

O projeto de um TAD envolve a escolha de operaes adequadas para uma


estrutura de dados, definindo seu comportamento. Algumas dicas interes-
santes so:

definir um nmero pequeno de operaes, com solues simples, que


combinadas possam realizar funes mais complexas;
o conjunto de operaes deve ser adequado o suficiente para realizar
as computaes necessrias s aplicaes que utilizaro o TAD. A ob-
teno das informaes bsicas no deve ser simples e direta para as
aplicaes;
cada operao deve ter um propsito definido, com um comportamento
constante e coerente, sem muitos casos especiais e excees.
Captulo 2 Conceitos Bsicos 41

Os TADs podem ainda ser classificados como genricos ou especficos. Os


TADs genricos so estruturas de dados nas quais possvel acrescentar
qualquer item de dados. Por exemplo, um TAD listas pode ser utilizado
para representar uma lista de freqncia de alunos, uma lista telefnica, etc.
Os TADs especficos so definidos para um dado domnio de aplicao,
como uma agenda de telefones. No se deve, entretanto, misturar caracte-
rsticas genricas com caractersticas especficas de domnio. No contexto
deste livro vamos trabalhar com TADs genricos para listas, pilhas, filas e
rvores.

2.3 alternativas de representao fsica


Um aspecto que deve ser considerado na anlise das estruturas de dados a
serem estudadas a forma utilizada para representar fisicamente os relacio-
namentos lgicos entre os dados. Por representao fsica de uma estrutura
de dados consideramos somente a forma utilizada para implementar os re-
lacionamentos entre os diferentes nodos, e no a representao fsica das
informaes internas de cada nodo. Por exemplo, na implementao fsica
de uma lista linear, a ser vista no captulo 3, considera-se somente como ser
implementada a relao de ordem entre os seus nodos.

Existem duas alternativas bsicas de representao fsica de dados, analisa-


das a seguir: contigidade fsica e encadeamento. Em qualquer uma delas,
importante notar que a posio de um componente na estrutura lgica
determina sua posio na estrutura fsica escolhida.

2.3.1 contigidade fsica

Nesta alternativa, os dados so armazenados em posies contguas na mem-


ria. A ordem entre os nodos da estrutura armazenada definida implicitamente
pela posio ocupada pelos nodos na memria. Assim, cada posio contgua
na memria armazena o conjunto de informaes correspondente a um nodo,
que pode ser simples ou complexo, apresentando um ou vrios campos.

Para que um dado esteja efetivamente representado, necessrio que, a


partir de sua representao fsica, se possa reconstituir tanto sua estrutura
42 Estruturas de Dados

lgica quanto seus componentes. A representao por contigidade fsica


intuitiva e natural para estruturas que apresentam um relacionamento lgico
de ordem linear entre os nodos. Existem, entretanto, estruturas que apresen-
tam outras formas de relacionamentos entre os nodos, como relacionamen-
tos de subordinao, para as quais esta forma de representao fsica no
intuitiva.

As vantagens da representao das estruturas de dados por contigidade


fsica so:

proteo de memria a alocao feita antes do incio da execuo do


programa, garantindo a proteo da memria;
transferncia de dados como todos os dados esto alocados em bloco,
a transferncia de dados entre memria principal e secundria fica facili-
tada;
estruturas simples apropriada para armazenar estrutura simples,
principalmente aquelas que utilizam a ordem fsica em sua representao;
representao algumas estruturas de dados possuem uma representao
lgica semelhante contigidade fsica, simplificando desta maneira a
representao dos dados;
acesso qualquer nodo pode ser diretamente acessado a qualquer momen-
to, atravs de um ndice associado sua posio.

As desvantagens da representao das estruturas de dados por contigida-


de fsica so:

compartilhamento de memria este tipo de alocao no permite o com-


partilhamento de memria;
previso de espao fsico necessrio definir, antes da execuo da
aplicao, o nmero mximo de nodos a serem alocados. Isto pode cons-
tituir um grave problema quando no for possvel estimar, a priori, o n-
mero de nodos que a estrutura vai apresentar;
estruturas complexas no apropriado para estruturas complexas, devi-
do natureza seqencial;
insero e excluso de componentes estas duas operaes geralmente
implicam no deslocamento de um nmero considervel de informaes,
Captulo 2 Conceitos Bsicos 43

de modo a preservar as relaes lgicas representadas, ou seja, existe a


necessidade de reestruturao dos componentes da estrutura de dados,
durante sua manipulao.

2.3.2 encadeamento
O espao necessrio para a representao dos dados pode ser alocado me-
dida que se torne necessrio, atravs de alocao dinmica. Sempre que um
espao de memria para armazenar um dado seja necessrio, este solicita-
do pela aplicao, e alocado pelo gerenciador de memria em algum espao
livre da memria, sendo seu endereo devolvido em uma varivel especial. As
principais linguagens de programao permitem esta forma de alocao atra-
vs de variveis do tipo ponteiro (tambm denominadas de apontadores).

Uma estrutura armazenada atravs de encadeamento apresenta seus nodos


alocados em posies aleatrias na memria, e no lado a lado, como na
representao por contigidade fsica. A disposio fsica dos componentes
de uma estrutura independe de sua posio na estrutura lgica. Deste modo,
para percorrer a estrutura necessrio que os nodos, alm do(s) campo(s) de
informao, apresentem algum campo adicional, onde colocado o endere-
o fsico do prximo nodo.

As vantagens da representao das estruturas de dados por encadeamento


so:

compartilhamento de memria uma vez que os nodos de uma estrutura


so indicados atravs de seus endereos, os mesmos nodos poderiam fa-
zer parte de mais de uma estrutura;
maleabilidade a alocao e a liberao de memria feita de forma din-
mica favorece a maleabilidade dos programas;
facilidade para insero e remoo de componente a insero e a re-
moo de nodos facilmente realizada, sendo somente necessrio ajustar
os campos de elo dos nodos envolvidos na operao, sem a necessidade
de deslocamento de informaes.

As desvantagens desta forma de representao fsica so:


44 Estruturas de Dados

transferncia de dados dificultada neste tipo de representao, uma


vez que os dados esto espalhados na memria;
gerncia de memria mais onerosa toda a manipulao da estrutura
feita atravs de alocao e/ou liberao de memria, o que deve ser reali-
zado pelo gerenciador de memria;
procedimentos menos intuitivos a utilizao de alocao dinmica im-
plica na construo de procedimentos que envolvam alocao e liberao
de memria, e no encadeamento dos nodos. Isto faz com que os procedi-
mentos escritos para as operaes sobre os dados sejam mais complexos;
acesso o processamento dos dados encadeados deve ser feito de forma
serial, isto , um nodo deve ser sempre acessado a partir de outro acessa-
do anteriormente. No possvel, como nos casos dos arranjos, acessar
qualquer nodo a qualquer momento, a menos que todos os endereos
sejam armazenados individualmente.

2.3.3 representao fsica mista


Em alguns casos interessante utilizar uma representao fsica mista parte
da estrutura armazenada atravs de contigidade fsica, e parte por encade-
amento. Esta forma muito utilizada para armazenar estruturas complexas,
com operaes especficas. Neste texto no ser considerada esta forma de
armazenamento fsico.

2.4 exerccios
exerccio 1 Especifique um TAD que seja capaz de armazenar uma data
composta por dia, ms e ano e implemente o seguinte conjunto de operaes
para manipular esse tipo Data:

uma funo que recebe como parmetro o dia, o ms, o ano e uma es-
trutura do tipo Data, onde o resultado deve ser armazenado, e retorna
verdadeiro se a data estiver vlida; caso contrrio, retorna falso. A vali-
dao da data pode ser feita da seguinte forma:
meses com 30 dias: 04, 06, 09 e 11;
meses com 31 dias: 01, 03, 05, 07, 08, 10,12;
Captulo 2 Conceitos Bsicos 45

clculo de ano bissexto: cada ano divisvel por 4 um ano bissexto (E);
cada ano divisvel por 100 no bissexto (OU); todo ano divisvel por
400 sempre um ano bissexto;
uma funo que recebe como parmetro uma data do tipo string (no
formato DD/MM/AAAA) e uma estrutura do tipo Data, onde o resultado
deve ser armazenado, e retorna verdadeiro se a data estiver vlida; caso
contrrio, retorna falso;
uma funo que recebe como parmetro uma estrutura do tipo Data e um
nmero inteiro, e retorna a soma do nmero de dias da data recebida;
uma funo que recebe como parmetro uma estrutura do tipo Data
e um nmero inteiro, e retorna a subtrao do nmero de dias da data
recebida;
uma funo que recebe como parmetro uma data e escreve essa data
por extenso. Por exemplo, 25/03/2007 deve ser escrito como 25 de maro
de 2007. A funo deve retornar verdadeiro se a operao for realizada
com sucesso e falso, caso contrrio;
uma funo que receba como parmetro o ano e retorne a data da Ps-
coa. O domingo de Pscoa o primeiro domingo depois da primeira lua
cheia do outono. Utilize o seguinte algoritmo, criado em 1800 pelo ma-
temtico Carl Gauss:
suponha que y seja o ano (como 1800 ou 2001);

divida y por 19 e chame o resto de a. Ignore o quociente;

divida y por 100 para obter o quociente b e o resto c;

divida b por 4 para obter o quociente d e o resto e;

divida 8 * b + 13 por 25 para obter o quociente g. Ignore o resto;

divida 19 * a + b - d - g + 15 por 30 para obter o quociente h.

Ignore o resto;
divida c por 4 para obter o quociente j e o resto k;

divida a + 11 * h por 319 para obter o quociente m. Ignore o resto;

divida 2 * e + 2 * j - k - h + m + 32 por 7 para obter o resto r.

Ignore o quociente;
divida h - m + r + 90 por 25 para obter o quociente n. Ignore o

resto;
divida h - m + r + n + 19 por 32 para obter o resto p. Ignore o

quociente.
46 Estruturas de Dados

exerccio 2 Considere uma aplicao para armazenar os seguintes dados


de uma pessoa em uma agenda de endereos: nome, endereo e telefone.
Especifique um TAD para armazenar os dados das pessoas e as operaes
necessrias para inserir, consultar e excluir os dados das pessoas.

exerccio 3 Considere uma aplicao para armazenar os seguintes dados de


carros para uma garagem: placa, marca/modelo e cor. Especifique um TAD
para armazenar os dados dos carros e as operaes necessrias para inserir,
consultar e excluir os dados das pessoas.

exerccio 4 Considere uma empresa que precisa armazenar os seguintes da-


dos de um cliente:

nome completo;
ano de nascimento;
renda mensal do cliente.

Especifique um TAD para armazenar os dados de um cliente e as operaes


necessrias para inserir, consultar e excluir os dados dos clientes. Especifi-
que tambm operaes para exibir o nmero de clientes com renda mensal
acima da mdia, e exibir o nmero de clientes que nasceram entre 1980 e
2000.

exerccio 5 Considere um conjunto de informaes relativas a alunos, cons-


titudo de nome, nmero de matrcula e data de nascimento. Especifique um
TAD para armazenar os dados dos alunos e as operaes necessrias para
inserir, consultar e excluir esses dados. Implemente uma aplicao que utilize
o tipo Aluno e ainda execute as seguintes operaes:
Captulo 2 Conceitos Bsicos 47

imprima os nomes e nmeros de matrcula dos alunos que nasceram aps


uma determinada data (passada como parmetro);
imprima as informaes relativas a um determinado aluno, cujo nmero
de matrcula passado como parmetro.

exerccio 6 Os dados relativos aos clientes de uma empresa esto armaze-


nados em um arquivo. Para cada cliente so registrados um cdigo, o nome,
o endereo, o telefone, a data em que fez sua primeira compra na empresa, a
data da ltima compra e o valor da ltima compra. Especifique o TAD Clien-
tes para armazenar os dados dos clientes e as operaes necessrias para
inserir, consultar e excluir esses dados. Implemente uma aplicao que utilize
o tipo Clientes.
captulo
???????? 3
listas lineares
???????

de?????????????????????????
Lista Linear um conjunto elementos de mesmo tipo,
denominados nodos, entre os quais??????????????????
existe uma relao
de ordem linear (ou total). O relacionamento entre os nodos de
uma lista linear definido somente por sua posio em relao aos
outros nodos. Os nodos de uma lista podem conter, cada um
deles, um dado primitivo ou um dado composto. Quando a lista
apresenta todos os nodos com a mesma estrutura interna,
a lista denominada homognea. Listas compostas de nodos
com diferentes estruturas internas, denominadas no
heterogneas, no so consideradas neste texto.
50 Estruturas de Dados

Toda lista linear apresenta um nodo que encabea a lista, que o primeiro
nodo da lista. A partir deste segue uma seqncia de nodos, conforme a
ordem definida entre eles, at o ltimo nodo. Todo nodo de uma lista linear
apresenta um nodo diretamente antes dele (com exceo do primeiro), e ou-
tro imediatamente depois dele (exceto o ltimo). O nmero de nodos de uma
lista denominado de comprimento da lista.

A Figura 3.1 apresenta uma lista linear composta por cinco nodos, sendo
cada um identificado por uma letra (a, b, e) que simboliza o contedo
de seu(s) campo(s) de informao. O primeiro nodo aquele que apresenta
a informao a, seguido daquele de informao b; o ltimo nodo apresenta
a informao e.

Inmeras aplicaes apresentam dados que, por sua natureza, so organiza-


dos em listas lineares. Alguns exemplos de informaes geralmente organiza-
das em listas lineares so:

as notas de cada aluno de uma turma, sendo a ordem das notas definida
pela posio que o aluno ocupa na turma, ou de acordo com o nmero
de sua matrcula;
o cadastro de funcionrios de uma empresa, organizado de acordo com
seu nmero de matrcula, ou simplesmente pela ordem em que foram
admitidos na empresa;
os 7 dias da semana constituem uma lista, onde a segunda-feira precede
a tera-feira e vem depois do domingo;

a b c d e

Segundo nodo

Primeiro nodo ltimo nodo

Figura 3.1 Lista linear.


Captulo 3 Listas Lineares 51

valores obtidos atravs de medies, quando a ordem em que estas foram


feitas relevante para a anlise dos dados. Por exemplo, registro de tem-
peraturas de uma localidade.

A estrutura interna de cada componente de uma lista linear pode apresentar


qualquer nvel de complexidade. Pode ser um tipo simples, um arranjo, um
registro, ou outro TAD qualquer. A estrutura interna dos nodos abstrada
na manipulao da lista, interessando somente as relaes de ordem entre os
diferentes nodos.

Formalmente, uma lista linear pode ser definida da seguinte maneira: uma
coleo de n 0 nodos x1, x2,..., xn, todos do mesmo tipo, cujas proprieda-
des estruturais relevantes envolvem apenas as posies relativas lineares entre
os nodos:

n = 0: lista vazia, apresenta zero nodos


n > 0: x1 o primeiro nodo
xn o ltimo nodo
1 < k < n: xk precedido por xk-1 e sucedido por xk+1

operaes sobre listas lineares


Listas lineares, como quaisquer TADs, requerem a definio das operaes
que podem ser realizadas sobre elas. Vrias operaes de manipulao de
uma lista podem ser necessrias em uma aplicao. Para cada uma delas
devem ser definidos procedimentos especficos, de modo que este tipo de
dado possa ser facilmente manipulado. O programa de aplicao dever se
preocupar somente com a utilizao da lista, estando as operaes bsicas j
disponveis. Ateno redobrada deve ser dada eficincia dos procedimentos
que implementam as operaes mais utilizadas, por estarem presentes em
quase todas as aplicaes que usam listas lineares. As operaes bsicas so-
bre listas lineares so as seguintes:

criao de uma lista a primeira operao a ser executada, atravs da


qual so alocadas as variveis necessrias para a definio da lista e inicia-
lizadas suas variveis de controle. As demais operaes ficam habilitadas
somente depois da execuo desta operao;
52 Estruturas de Dados

insero de um nodo a maneira de formar a lista, inserindo os nodos


um a um. A insero de um nodo pode ser feita no incio da lista, no final
da lista, ou em alguma posio dentro da lista;
excluso de um nodo a forma de excluir um nodo da lista. A excluso
tambm pode ser feita no incio da lista, no final da lista, ou em alguma
posio no meio da lista;
acesso a um nodo para consulta ou alterao de seus valores internos. O
nodo pode ser identificado por sua posio na lista ou atravs de alguma
informao que ele contm;
destruio de uma lista operao executada quando uma lista
existente no mais necessria. A lista no poder mais ser utilizada
depois da execuo desta operao. Pode ocorrer que a lista, na rea-
lidade, continue existindo fisicamente, mas sua utilizao no mais
permitida.

importante lembrar que estas so somente as operaes bsicas sobre listas


outras operaes podem ser necessrias em aplicaes especficas, devendo
ser implementadas de acordo com a necessidade.

A representao fsica utilizada para armazenar uma lista linear influi direta-
mente nos algoritmos definidos para as operaes a serem definidas sobre
ela. A escolha entre uma dessas formas de representao est relacionada
a dois fatores principais: a freqncia com que as operaes so executadas
sobre a lista e o volume de dados envolvido nas aplicaes. Neste captulo so
discutidos os algoritmos que lidam com listas lineares e suas estruturas de
armazenamento. Inicialmente so consideradas as listas representadas atra-
vs de contigidade fsica e, em seguida, as mesmas operaes considerando
listas representadas atravs de encadeamento.

Uma forma alternativa e eficiente de representar listas lineares, que facilita o


acesso a seus nodos, usar variveis especiais, aqui denominadas de descri-
tores. Um descritor apresenta informaes sobre alguns nodos especiais e
sobre a lista propriamente dita. Esta possibilidade tambm ser considerada
nos algoritmos vistos a seguir.
Captulo 3 Listas Lineares 53

3.1 listas lineares implementadas atravs


de contigidade fsica
Listas lineares implementadas atravs de contigidade fsica utilizam a seqen-
cialidade da memria do computador para representar a ordem dos nodos na
lista. Endereos fisicamente adjacentes na memria representam nodos logica-
mente adjacentes na lista. Deste modo, o relacionamento lgico representado
pela posio de um nodo na lista no precisa ser explicitamente representado.

A forma mais usual de implementar uma lista linear atravs de contigidade


fsica atravs da utilizao de um arranjo de uma dimenso (vetor). Cada
elemento do arranjo representa um nodo da lista. Qualquer nodo da lista
pode ser acessado diretamente atravs do ndice do arranjo, que representa
sua posio na lista. A Figura 3.2 ilustra uma lista linear de 6 nodos, repre-
sentada pelo arranjo LL de 6 elementos. O primeiro nodo desta lista (L1) est
armazenado em LL[1], o segundo em LL[2] e o ltimo em LL[6].

A possibilidade de acessar diretamente um nodo uma caracterstica impor-


tante deste tipo de implementao, pois no necessrio percorrer toda a
lista, a partir de seu incio, para que um determinado nodo seja acessado.

Todos os elementos de um arranjo apresentam o mesmo tipo de dado, que


representa o conjunto de informaes do nodo. Como exemplo, considere-
mos uma lista linear que agrupa e ordena os produtos vendidos em uma

L1 L2 L3 L4 L5 L6

1 2 3 4 5 6

LL L1 L2 L3 L4 L5 L6

Figura 3.2 Lista linear implementada atravs de contigidade fsica.


54 Estruturas de Dados

loja. Cada nodo desta lista traz informaes relativas a um produto, como o
nome do produto, seu cdigo e seu preo de venda. Considerando que a loja
venda no mximo N produtos diferentes, os seguintes tipos de dados devem
ser utilizados:

TipoNodo = registro
Nome: string
Cdigo: inteiro
Valor: real
fim registro
TipoLista = arranjo [1.. N] de TipoNodo

A natureza dinmica das listas faz com que seu comprimento varie durante
uma aplicao, pela insero de novos nodos e pela remoo de nodos exis-
tentes. A sucessiva incluso e remoo de nodos em uma lista pode levar a
situaes em que suas extremidades (primeiro e ltimo nodo) no coincidam
com as extremidades do arranjo. Isto implica que se tenha, alm dos indica-
dores dos ndices de incio e final do arranjo (aqui denominados de IA e FA),
indicadores das posies onde esto alocados o primeiro e o ltimo nodo da
lista (aqui denominados respectivamente IL e FL). Por exemplo, na Figura
3.3 o arranjo LL de 10 elementos implementa uma lista linear de 5 nodos,
iniciando esta lista no ndice IL do arranjo (no exemplo mostrado, ndice 3) e
terminando no ndice FL (no exemplo, ndice 7).

possvel armazenar mais de uma lista em um mesmo arranjo. Por exemplo,


na Figura 3.4 representado o arranjo LL implementando duas listas a
primeira (de 2 nodos) inicia no ndice IL1 e termina no ndice FL1, enquanto
que a segunda (de 3 nodos) inicia no ndice IL2 e termina no ndice FL2.
Ao fazer as incluses de novos nodos em listas implementadas desta forma,
deve-se tomar cuidado para que no seja utilizado o espao que est sendo
ocupado pela outra lista.

IA IL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5

Figura 3.3 Lista linear utilizando parte de um arranjo.


Captulo 3 Listas Lineares 55

IA IL1 FL1 IL2 FL2 FA


1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L1 L2 L3

Figura 3.4 Vrias listas lineares implementadas sobre um mesmo arranjo.

Caso uma aplicao utilize um s arranjo para implementar mais de uma lista,
aconselhada a definio a priori da rea que ser disponibilizada para cada
um deles. Isto feito definindo os ndices IA e FA para cada lista, de modo
que uma no possa avanar sobre o espao reservado para a outra.

A seguir sero vistos algoritmos correspondentes s principais operaes que


podem ser executadas sobre listas lineares implementadas sobre arranjos.
importante lembrar que os algoritmos apresentados no esgotam o assunto,
j que outras operaes podem ser necessrias em aplicaes especficas.

3.1.1 criao de uma lista linear vazia

Criar uma lista linear significa alocar a rea fsica onde a lista ser armazena-
da e inicializar suas variveis de controle (primeiro nodo, ltimo nodo, etc.).
A criao de uma lista linear no implica na necessidade de ela apresentar
imediatamente nodos com informaes. Uma lista linear geralmente criada
vazia, ou seja, sem nodo. Mais tarde, medida que a aplicao necessitar,
os nodos sero inseridos na lista.

A criao de uma lista linear implementada atravs de contigidade fsica


requer a alocao fsica do arranjo e a inicializao das variveis que iro in-
formar os ndices do primeiro e do ltimo nodo da lista.

A posio das extremidades de uma lista sobre o arranjo pode ser informada
de diversas formas. Para a indicao do primeiro nodo da lista pode ser uti-
lizado diretamente o ndice de sua posio no arranjo, ou ento a distncia
que ocupa a partir do primeiro elemento do arranjo (que no necessariamen-
te inicia com ndice um). O ltimo nodo da lista tambm pode ser indicado
atravs de seu ndice no arranjo, ou ento esta posio pode ser calculada
atravs do nmero de nodos mximo que a lista poder apresentar. A forma
de indicar a posio dos limites da lista evidentemente ir influir nos algorit-
mos desenvolvidos para manipular esta lista.
56 Estruturas de Dados

Assim, a criao de uma lista linear implementada sobre um arranjo requer


que inicialmente seja alocado o arranjo LL onde a lista ser implementada,
assim como as variveis que contm os ndices de seus limites, ou seja, os
ndices da primeira posio no arranjo que esta lista poder ocupar (denomi-
nado de IA) e o da ltima (denominado FA).

Em seguida, devem ser inicializadas as variveis que indicam o incio e o final


da lista (denominadas de IL e FL). No processo de inicializao de uma lista,
os valores utilizados para inicializar os indicadores de incio e final da lista
devem trazer a informao de que a lista est vazia. Isto pode ser feito de
vrias maneiras, por exemplo, indicando para incio da lista (IL) um ndice
menor do que o da primeira posio que a lista pode ocupar no arranjo. A ini-
cializao do final da lista (FL) geralmente s necessria para servir de base
para atualizar este indicador, quando o primeiro nodo for inserido na lista. O
importante que os procedimentos que implementam as demais operaes
sobre a lista conheam a estratgia utilizada para inicializ-la, podendo desta
maneira reconhecer quando a lista est vazia.

O algoritmo apresentado a seguir recebe como parmetro o ndice do incio


da rea que pode ser utilizada para a lista sobre o arranjo (IA). Em todos os
algoritmos a seguir, a indicao de que a lista est vazia feita inicializando
as variveis de IL e FL em um ndice imediatamente anterior ao incio da rea
disponvel. Considera-se aqui que a alocao do arranjo e a definio da rea
disponvel para a lista j foram realizadas pela aplicao.

Algoritmo 3.1 InicializarLLArr


Entradas: IA (inteiro)
Sadas: IL, FL (inteiro)
incio
IL FL IA 1
fim

3.1.2 insero de um novo nodo


Para realizar a operao de insero de um novo nodo em uma lista linear de-
vem ser informados (1) a posio do novo nodo na lista (sua ordem na lista),
e (2) o valor do campo de informao deste novo nodo. Duas situaes so
identificadas nas quais impossvel realizar a insero:
quando a posio solicitada no for coerente com a lista atualmente exis-
o
tente por exemplo, a lista apresenta 10 nodos e se quer inserir o 13 ;
Captulo 3 Listas Lineares 57

quando o espao que a lista pode ocupar no arranjo estiver totalmente


preenchido.

O algoritmo que implementa a operao de insero deve verificar estas


condies e, caso no seja possvel realizar a operao, comunicar o fato
aplicao. Uma vez verificada a possibilidade de realizar a insero, a imple-
mentao da operao vai depender da posio onde o novo nodo dever ser
inserido se no incio, no meio ou no final da lista. A seguir so analisadas
separadamente estas trs situaes de insero.

Insero como primeiro nodo da lista. Quando a lista inicia na primeira


posio disponvel no arranjo, todos os nodos da lista devem ser deslocados
para a posio seguinte, liberando a primeira posio para o novo nodo. O
indicador de final da lista (FL) deve ser atualizado para a posio seguinte
no arranjo. A Figura 3.5 exemplifica esta operao, considerando um arranjo
de 10 posies, e uma lista com 6 nodos, que inicia na primeira posio do
arranjo. Aps o deslocamento de todos os nodos da lista, o novo nodo in-
serido na primeira posio, e a lista passa a ter 7 nodos.

No caso de a lista no iniciar na primeira posio do arranjo (IL > IA), no h


necessidade de realizar o deslocamento de todos os nodos, uma vez que o
novo nodo pode ser inserido diretamente na posio logo abaixo do incio da

Inserir
no incio
IL
IA FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5 L6

IL
IA FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5 L6 L7

Figura 3.5 Insero no incio de uma lista, com deslocamento.


58 Estruturas de Dados

lista, desde que esta esteja livre. O indicador de incio da lista deve ser atuali-
zado para a posio agora ocupada pelo novo nodo (Figura 3.6).

A seguir apresentado um algoritmo que insere um nodo no incio de uma


lista linear implementada sobre o arranjo LL, sendo a rea disponvel para a
lista limitada pelos ndices IA e FA. A lista, antes da insero do novo nodo,
ocupa as posies entre os ndices IL e FL. A funo recebe, ainda, as infor-
maes que devem ser inseridas no novo nodo (InfoNodo). Aps a insero,
o procedimento devolve o arranjo e os ndices de limites da lista atualizados.
Caso haja espao para inserir o novo nodo, o algoritmo inicialmente verifica
se existe espao livre no incio, caso em que basta mudar o ndice de incio da
lista (IL) para uma posio antes daquela que ocupava. No caso da lista ini-
ciar na primeira posio disponvel do arranjo, feito o deslocamento de toda
a lista para abrir espao para o novo nodo. O parmetro Sucesso retorna
verdadeiro caso a insero tenha sucesso, e falso no caso contrrio.

Algoritmo 3.2 - InserirIniLLArr


Entradas: LL (TipoLista)
IA, FA, IL, FL (inteiro)
InfoNodo (TipoNodo)
Sadas: LL (TipoLista)
IL, FL (inteiro)
Sucesso (lgico)
Varivel auxiliar: Ind (inteiro)

Inserir
no incio

IA IL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5 L6

IA IL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5 L6 L7

Figura 3.6 Insero no incio de uma lista, sem deslocamento.


Captulo 3 Listas Lineares 59

incio
se (IA = IL) e (FA = FL)
ento Sucesso falso
seno incio
se IL = 0
ento IL FL IA
seno se IL > IA
ento IL IL-1
seno incio {DESLOCAR NODOS PARA CIMA}
para Ind de FL incr -1 at IL faa
LL[Ind+1] LL[Ind]
FL FL+1
fim
LL[IL] InfoNodo
Sucesso verdadeiro
fim
fim

Insero como ltimo nodo da lista. Para inserir um novo nodo no final
da lista somente necessrio avanar o indicador de final da lista, no sendo
alteradas as posies do restante da lista. Pode ocorrer o caso de a lista estar
ocupando as ltimas posies do arranjo, mas ainda existirem posies livres
no incio neste caso todos os nodos da lista devero ser deslocados uma
posio para baixo, de modo a liberar a ltima posio, na qual ser inserido
o novo nodo (Figura 3.7).

Inserir
no incio
FL
IA IL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5 L6

FL
IA IL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5 L6 L7

Figura 3.7 Insero no final de uma lista, com deslocamento.


60 Estruturas de Dados

O algoritmo apresentado a seguir insere um nodo no final de uma lista


linear implementada sobre o arranjo LL, de limites IA e FA. O algoritmo
recebe o nome do arranjo e seus limites, os limites da lista e as informaes
a serem inseridas no novo nodo (InfoNodo). De forma anloga ao algo-
ritmo anterior, caso haja espao para inserir o novo nodo, verifica se existe
espao livre no final para a insero, seno efetuado o deslocamento de
toda a lista uma posio para baixo, liberando a ltima posio do arranjo.
O parmetro Sucesso retorna verdadeiro caso a insero tenha sucesso, e
falso caso contrrio. O algoritmo devolve o arranjo e os ndices de limites da
lista atualizados.

Algoritmo 3.3 - InserirFimLLArr


Entradas: LL (TipoLista)
IA, FA, IL, FL (inteiro)
InfoNodo (TipoNodo)
Sadas: LL (TipoLista)
IL, FL (inteiro)
Sucesso (lgico)
Varivel auxiliar: Ind (inteiro)
incio
se (IA = IL) e (FA = FL)
ento Sucesso falso
seno incio
se IL = 0 {LISTA VAZIA}
ento IL FL IA
seno se FL < FA {TEM ESPAO ATRS}
ento FL FL+1
seno incio {DESLOCAR NODOS PARA BAIXO}
para Ind de IL incr 1 at FL faa
LL[Ind-1] LL[Ind]
IL IL-1
fim
LL[FL] InfoNodo
Sucesso verdadeiro
fim
fim

Insero no meio da lista. Esta insero requer a movimentao de todos


os nodos acima ou abaixo da posio onde vai ser feita a insero do novo
nodo. A Figura 3.8 apresenta a insero de um novo nodo na terceira posi-
o de uma lista linear. Para que esta insero possa ser realizada, os nodos
Captulo 3 Listas Lineares 61

Inserir
Posio: 3 nodo
IA IL FL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5

IA IL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5 L6

Figura 3.8 Insero no meio de uma lista linear.

que ocupam as posies a partir da terceira devem ser deslocados para a


posio seguinte no arranjo. O indicador de final da lista deve ser acrescido
de uma unidade.

A seguir apresentado um algoritmo que insere um novo nodo em uma lista


linear, implementada por contigidade fsica. utilizado um arranjo LL, po-
dendo a lista ocupar as posies de ndices IA at FA. A funo recebe como
entradas a posio K (ordem na lista) de insero do novo nodo e as informa-
es que devem ser inseridas em seu campo de informao (InfoNodo), alm
dos ndices do incio e do final da lista (IL e FL).

Antes de realizar a insero do novo nodo na lista, o algoritmo analisa se a


insero possvel, verificando:

se existe espao no arranjo para realizar a insero a insero no pode-


r ser realizada caso o arranjo esteja todo ocupado;
se a posio de insero vlida a posio recebida dever ser um va-
lor maior do que zero; se a lista estiver vazia (condio representada no
procedimento por IL = 0), a insero poder ser realizada somente na
primeira posio; se a lista no for vazia, a posio no poder ser maior
do que o nmero de nodos apresentado pela lista antes da insero, incre-
mentado de uma unidade.
62 Estruturas de Dados

Se alguma destas condies falhar, o parmetro lgico Sucesso retorna falso,


indicando que a insero no pode ser realizada. Se o nodo inserido, Su-
cesso retorna verdadeiro.

O algoritmo aqui mostrado inclui os outros dois apresentados nesta seo: se


K=1, a insero realizada no incio da lista; e se K=FL-IL+2, o novo nodo
inserido no final da lista.

Algoritmo 3.4 - InserirLLArrPosK


Entradas: LL (TipoLista)
IA, FA, IL, FL (inteiro)
K (inteiro)
InfoNodo (TipoNodo)
Sadas: LL (TipoLista)
IL, FL (inteiro)
Sucesso (lgico)
Varivel auxiliar: Ind (inteiro)
incio
se (IA=IL e FA=FL) ou (K > FL-IL+2) ou (K0) ou (IL=0 e K1)
ento Sucesso falso
seno incio
se IL = 0
ento IL FL IA
seno se FL FA
ento incio {DESLOCAR NODOS PARA CIMA}
para Ind de FL incr -1 at IL+K-1 faa
LL[Ind+1] LL[Ind]
FL FL+1
fim
seno incio {DESLOCAR NODOS PARA BAIXO}
para Ind de IL incr 1 at IL+K-2 faa
LL[Ind-1] LL[Ind]
IL IL - 1
fim
LL[IL+K-1] InfoNodo
Sucesso verdadeiro
fim
fim

Uma forma de otimizar a insero procurar diminuir o nmero de deslo-


camentos de nodos. Isto pode ser feito verificando onde fica a posio em
que o nodo deve ser inserido. Caso esta ficar mais prxima do incio da lista,
o deslocamento deve ser feito para baixo, desde que haja espao livre deste
Captulo 3 Listas Lineares 63

lado da lista; se a posio ficar mais prxima do final da lista, o deslocamento


deve ser feito para cima, tambm condicionado existncia de espao deste
lado da lista. O algoritmo de insero otimizado apresentado a seguir. A
insero do primeiro nodo realizada j no meio do arranjo, permitindo des-
locamentos para os dois lados do arranjo.

Algoritmo 3.5 - InserirLLArrPosKOt


Entradas: LL (TipoLista)
IA, FA, IL, FL (inteiro)
K (inteiro)
InfoNodo (TipoNodo)
Sadas: LL (TipoLista)
IL, FL (inteiro)
Sucesso (lgico)
Varivel auxiliar: Ind (inteiro)
incio
se (IA=IL e FA=FL) ou (K > FL-IL+2) ou (K0) ou (IL=0 e K1)
ento Sucesso falso
seno incio
se IL = 0
ento IL FL (FA-IA+1) div 2 {INSERE NO MEIO}
seno se IL = IA ou ((FL FA) e (K > (FL-IL+2/2))
ento incio {DESLOCAMENTO PARA CIMA}
para Ind de FL incr -1 at IL+K-1 faa
LL[Ind+1] LL[Ind]
FL FL+1
fim
seno incio {DESLOCAMENTO PARA BAIXO}
para Ind de IL incr 1 at IL+K-2 faa
LL[Ind-1] LL[Ind]
IL IL - 1
fim
LL[IL+K-1] InfoNodo
Sucesso verdadeiro
fim
fim

3.1.3 remoo de um nodo

A prxima operao a ser analisada remove um determinado nodo de uma


lista linear. Este nodo pode ser identificado atravs de sua ordem na lista, ou
atravs de alguma informao contida no prprio nodo.
64 Estruturas de Dados

Ser considerado aqui o caso em que a identificao do nodo a ser removido


feita atravs de sua ordem na lista ser removido o k-simo nodo da
lista, ou seja, nodo de ordem K a partir do incio da lista. Dada a alocao
contgua dos nodos, o nodo buscado facilmente localizado assim que for
identificada a posio onde inicia a lista, bastando para isso somar sua ordem
ao ndice da primeira posio ocupada. importante lembrar que a posio
do nodo buscado no contada a partir do incio do arranjo, mas sim a par-
tir do primeiro nodo da lista, que pode estar localizado em qualquer posio
do arranjo.

A remoo do k-simo nodo somente ter sucesso se a ordem do nodo so-


licitado (ndice K) for vlida, ou seja, estiver contida na lista. Caso a operao
seja realizada, a remoo do nodo implicar no rearranjo dos demais nodos,
de modo a no deixar espao livre entre os nodos da lista os nodos que o
seguem devem ser adiantados uma posio e o ndice de final da lista (FL)
deve ser atualizado. Caso o nodo removido seja o nico da lista, ela resulta
vazia, devendo ento os sinalizadores de incio e final da lista serem ajustados
para fornecer esta informao. Por exemplo, conforme feito na criao da lis-
ta (Algoritmo 3.1), IL e FL so colocados em um ndice uma unidade menor
do que o do limite inferior da rea disponvel para a lista no arranjo. A Figura
3.9 mostra a remoo do terceiro nodo da lista linear.

A seguir apresentado um algoritmo que remove o k-simo nodo de uma


lista linear implementada atravs de contigidade fsica. Inicialmente feita
a verificao da validade da ordem do nodo a ser removido em relao lista
existente; em seguida os nodos posteriores quele que deve ser removido so
deslocados uma posio para baixo, sobre-escrevendo o nodo a ser removi-
do; finalmente, o indicador de final de lista atualizado (passa a indicar a po-
sio anterior quela que apontava). Caso a lista tenha resultado vazia, feita
a atualizao dos indicadores de incio e de final da lista. Sucesso retorna
verdadeiro caso tenha sido possvel efetuar a remoo do nodo solicitado.

Algoritmo 3.6 - RemoverKLLArr


Entradas: LL (TipoLista)
IL, FL (inteiro)
K (inteiro)
Sadas: LL (TipoLista)
IL, FL (inteiro)
Sucesso (lgico)
Varivel auxiliar: Ind (inteiro)
Captulo 3 Listas Lineares 65

Remover
3 nodo

IA IL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4 L5

IA IL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L1 L2 L3 L4

Figura 3.9 Remoo do k-simo nodo de uma lista linear.

incio
se (K 0) ou (K > FL-IL+1)
ento Sucesso falso
seno incio
para Ind de IL+K-1 incr 1 at FL-1 faa
LL[Ind] LL[Ind+1]
FL FL-1
se FL = IL1
ento IL FL 0
Sucesso verdadeiro
fim
fim

Este algoritmo tambm pode ser otimizado: se o nodo a ser removido estiver
localizado na primeira metade da lista, o deslocamento deve ser feito para
baixo; caso contrrio, o deslocamento deve ser feito para cima.

3.1.4 acesso a um nodo


Acessar um nodo de uma lista linear significa identificar um determinado
nodo desta lista, para fins de consulta, alterao ou remoo. A identificao
do nodo pode ser feita pela sua posio na lista ou atravs de alguma infor-
mao contida no nodo. Estas duas alternativas so analisadas a seguir.
66 Estruturas de Dados

acesso a nodo identificado por sua ordem na lista


Vamos considerar inicialmente o caso em que a identificao do nodo seja
atravs de sua ordem na lista. Esta operao somente poder ser executada
se a ordem do nodo a ser acessado corresponder a um nodo da lista.

A seguir apresentado um algoritmo para acessar o k-simo nodo (nodo


de ordem K) da lista. Ele recebe, atravs de parmetros, a ordem do nodo a
ser acessado (K), o nome do arranjo onde a lista est armazenada (LL) e os
ndices IL e FL de controle do incio e do final da lista. Se o acesso foi efetu-
ado com sucesso, Sucesso retorna verdadeiro; caso contrrio, retorna falso.
O campo de informao do nodo acessado retornado atravs do parmetro
InfoNodo.

Inicialmente o algoritmo verifica se o nodo solicitado pode ser acessado e, em


caso afirmativo, faz o acesso diretamente ao nodo. Para que o nodo possa
ser acessado, necessrio que: (1) o nodo faa parte da lista, isto , que no
seja solicitado um nodo de ordem superior ao comprimento da lista, definido
pelos ndices IL e FL; e (2) que a lista no seja vazia.

Algoritmo 3.7 - AcessarKLLArr


Entradas: LL (TipoLista)
IL, FL (inteiro)
K (inteiro)
Sadas: InfoNodo (TipoNodo)
Sucesso (lgico)
incio
se (K 0) ou (K > FL-IL+1) ou (IL = 0)
ento Sucesso falso
seno incio
InfoNodo LL[IL+K-1]
Sucesso verdadeiro
fim
fim

acesso a nodo identificado atravs de seu contedo


Quando a identificao do nodo a ser acessado feita buscando um determi-
nado valor contido em algum campo de informao, a lista deve ser percor-
rida, a partir de seu primeiro nodo, at que seja encontrado o valor buscado.
Para este percurso utilizada a posio fsica contgua dos nodos na mem-
ria, ou seja, so percorridos em ordem os ndices do arranjo que implementa
Captulo 3 Listas Lineares 67

a lista. Caso a informao buscada possa estar repetida em mais de um nodo,


geralmente o acesso feito ao primeiro nodo que a possui. Utilizaremos aqui
um tipo de nodo que apresenta dois campos de informao, o campo Valor,
que contm o valor buscado e o campo Info, que contm o restante das
informaes no nodo:

TipoNodo = registro
Valor: inteiro
Info : TipoInfo
fim registro

O algoritmo a seguir devolve a Posio (o ndice no arranjo) do nodo para


o qual o campo Valor igual ao valor buscado (ValBuscado), que deve ser
passado como parmetro. Caso esta informao no seja encontrada no ar-
ranjo, devolvido o valor zero. Este algoritmo somente poder ser utilizado
caso o espao disponvel para esta lista no arranjo no apresente um elemen-
to de ndice zero. O algoritmo deve receber, ainda, o nome do arranjo que
implementa a lista e os ndices de incio e de final da lista.

Algoritmo 3.8 - PosValLLArr


Entradas: LL (TipoLista)
IL, FL (inteiro)
ValBuscado (TipoValor)
Sada: Posio(inteiro)
Variveis auxiliares:
I (inteiro)
Achou (lgico)
incio
Achou falso
Posio 0
I IL
enquanto (I FL) e (no Achou)
faa se LL[I].Valor = ValBuscado
ento incio
Posio I
Achou verdadeiro
fim
seno I I+1
fim

Esta forma de busca facilitada caso se tenha uma lista ordenada. Uma
lista ordenada uma lista linear onde so estabelecidas regras de precedncia
68 Estruturas de Dados

entre os elementos da lista, ou seja, uma coleo ordenada de nodos do


mesmo tipo. Podem ser encontrados na literatura diversos algoritmos que fa-
zem buscas em listas ordenadas. Como exemplo, apresentamos a seguir uma
funo que executa uma busca binria em uma lista ordenada. O mtodo
consiste na comparao do valor procurado com o nodo localizado no ende-
reo mdio do arranjo alocado para a lista. Se o valor procurado for menor
que o valor contido naquele nodo, o processo repetido para a primeira me-
tade do arranjo; caso contrrio, para a segunda metade. Se for igual, a busca
encerra-se com sucesso. Enquanto o valor procurado no for encontrado, o
processo de diviso ao meio repetido at que no seja mais possvel dividir.
Nesse caso, constata-se que o valor procurado no est presente no arranjo.

O algoritmo a seguir devolve a Posio (o ndice no arranjo) do nodo para o


qual o campo Valor igual ao valor buscado (ValBuscado), que deve ser pas-
sado como parmetro. Note que agora se supe que a lista esteja ordenada em
ordem crescente do campo Valor. Caso esta informao no seja encontrada
no arranjo, retornada a Posio zero. O algoritmo deve receber, ainda, o
nome do arranjo que implementa a lista, e os ndices de incio e final da lista.

Algoritmo 3.9 - PosValLLArrOrd


Entradas: LL (TipoLista)
IL, FL (inteiro)
ValBuscado (TipoNodo)
Sadas: Posio(inteiro)
Variveis auxiliares:
Meio, Inf, Sup (inteiro)
Achou (lgico)
incio
Achou falso
Posio 0
Inf IL
Sup FL
enquanto (Inf Sup) e (no Achou)
faa incio
Meio (Inf+Sup) div 2 {DIVISO INTEIRA}
se LL[Meio].Valor = ValBuscado
ento incio
Posio Meio
Achou verdadeiro
fim
seno se LL[Meio].Valor < ValBuscado
ento Inf Meio+1 {BUSCA SEGUE S NA METADE SUPERIOR}
Captulo 3 Listas Lineares 69

seno Sup Meio1 {BUSCA SEGUE S NA METADE INFERIOR}


fim
fim

3.2 listas lineares implementadas por


contigidade fsica com descritor
Para facilitar o acesso e a manipulao dos nodos de uma lista podem ser uti-
lizados descritores. Descritores so variveis que, como diz o nome, des-
crevem a lista isto , armazenam informaes adicionais relativas lista.

Os valores que o descritor deve armazenar so definidos pelo tipo de aplica-


o, de modo a facilitar as operaes mais usuais. As informaes contidas
no descritor podem, por exemplo, mostrar:

localizao da lista ndices que delimitam o espao do arranjo


disponvel para a lista;
acesso lista ndices de determinados nodos da lista, como o ndice
do primeiro nodo (permite percorrer a lista a partir do incio), o ndice do
ltimo nodo (para incluso de novos nodos no final da lista), o ndice do
nodo que est no meio da lista (para pesquisa no caso de lista com valores
ordenados), entre outros;
estrutura da lista informaes relevantes a respeito da lista, como
quantos nodos a lista apresenta no momento (comprimento da lista);
contedo da lista informaes sobre o contedo dos campos de
alguns nodos da lista. Por exemplo, se a aplicao utiliza muitas vezes o
maior valor contido em algum campo da lista, este maior valor pode ser
armazenado diretamente no descritor evitando, assim, que a lista seja fre-
qentemente percorrida em busca deste valor.

Como exemplo, a Figura 3.10 apresenta um descritor DescrLL para a lista


implementada sobre o arranjo LL. A varivel que representa o descritor apre-
senta cinco campos, todos inteiros, armazenando:

1 ndice do primeiro nodo da lista;


2 ndice do ltimo nodo da lista;
3 comprimento da lista;
4 ndice do nodo que contm o menor valor da lista;
5 ndice do nodo que contm o maior valor da lista.
70 Estruturas de Dados

Primeiro nodo
ltimo nodo
Comprimento da lista
Nodo com menor valor
Nodo com maior valor

1 2 3 4 5

DescrLL 3 8 6 7 4

1 2 3 4 5 6 7 8 9 10

LL 7 9 2 5 1 4

Figura 3.10 Descritor para uma lista linear implementada por contigidade fsica.

O acesso a uma lista com descritor sempre deve ser feito atravs deste descri-
tor. Por isso, importante que o descritor tenha todas as informaes neces-
srias para acessar e manipular a lista. Deste modo, detalhes da implemen-
tao da lista ficam afastados do usurio. Como exemplo, suponhamos que
uma lista linear est implementada sobre um arranjo LL de N elementos, do
tipo TipoNodo apresentado na Seo 3.1.4. Caso esta lista seja representada
pelo descritor DescrLL da Figura 3.10 (um arranjo de cinco elementos), as
informaes a seguir seriam obtidas da seguinte forma:

LL[DescrLL [1]].Info informao contida no primeiro nodo da lista;


LL[DescrLL [2]].Valor Valor contido no ltimo nodo da lista;
LL[DescrLL [5]].Valor maior Valor contido na lista;
DescrLL [3] comprimento da lista. A informao est contida diretamente
no descritor, no sendo necessrio percorrer a lista para obter seu com-
primento.

Suponhamos agora que esta lista tem outro descritor, DL, no formato de um
registro, onde o campo IL guarda o ndice do incio da lista, e o campo FL, o
ndice do final. Um terceiro campo, MaiorValor, traz o maior Valor contido
na lista:

TipoDescritor = registro
IL: inteiro
FL: inteiro
Captulo 3 Listas Lineares 71

MaiorValor: inteiro
fim registro

Algumas informaes que podem ser obtidas desta lista so:

LL[DL.IL].Info informao contida no primeiro nodo da lista;


LL[DL.FL].Valor Valor contido no ltimo nodo da lista;
DL.MaiorValor maior valor contido no campo Valor de todos os nodos
da lista. Neste caso, no necessrio acessar o arranjo, pois a informao
j est contida no descritor.

Os algoritmos das operaes apresentadas na seo 3.1 para as listas lineares


implementadas sobre arranjos precisam ser adaptados caso seja utilizado um
descritor para a lista. A principal alterao nos algoritmos na forma do acesso
lista, que sempre dever ser feito atravs das informaes contidas no descri-
tor. Nos algoritmos apresentados a seguir ser utilizado o seguinte descritor:

TipoDescr = registro
IA : inteiro
IL : inteiro
N : inteiro
FL : inteiro
FA : inteiro
fim registro

onde IA o ndice de incio da rea disponvel para a lista, IL o ndice do


primeiro nodo da lista, N o comprimento da lista, FL o ndice do ltimo
nodo da lista e FA o ndice do final da rea disponvel para a lista.

Lembramos que este descritor no o nico que pode ser definido para este
tipo de lista caso seja definida outra estrutura para o descritor, os algorit-
mos a seguir devem ser adaptados a ele.

3.2.1 criao de uma lista linear vazia com descritor


A criao de uma lista linear vazia com descritor consiste em alocar e inicia-
lizar seu descritor. A indicao de lista vazia, quando a lista implementada
por contigidade fsica com descritor, vai depender dos campos presentes
neste descritor. Diferentes estratgias podem ser utilizadas para dar esta in-
dicao os algoritmos que manipulam a lista devem conhecer a estratgia
utilizada, que deve ser padronizada em uma aplicao. Se, por exemplo, o
72 Estruturas de Dados

descritor apresentar um campo com o nmero de nodos da lista, a indicao


de lista vazia feita diretamente atravs deste campo. Quando este campo
no estiver presente, as indicaes de incio e de final da lista no momento
considerado devem trazer a indicao da lista vazia por exemplo, a indica-
o de incio da lista indicando um ndice menor do que o primeiro ndice do
arranjo. A Figura 3.11 ilustra duas estratgias para representar a lista vazia,
considerando que a lista pode ocupar os elementos de ndice 11 at 20 do
arranjo LL. A estratgia utilizada para indicar que a lista est vazia influencia
diretamente os algoritmos construdos para esta lista.

O algoritmo apresentado a seguir inicializa o descritor de uma lista linear.


Note que este algoritmo independe do nome do arranjo utilizado para imple-
mentar a lista. Os valores dos ndices de incio e de final da rea a ser ocupada
pela lista devem ser fornecidos como parmetros.

Algoritmo 3.10 InicLLArrDescr


Entradas: DL (TipoDescr)
IniArea, FimArea (inteiro)
Sada: DL (TipoDescr)
incio
DL.IL 0
DL.FL 0
DL.N 0
DL.IA IniArea
DL.FA FimArea
fim

IA IL N FL FA

DL 11 0 0 0 20

(Opo 1) IA IL N FL FA

DL 11 10 0 10 20

(Opo 2)

11 12 13 14 15 16 17 18 19 20

LL

Figura 3.11 Estratgias para representar uma lista vazia.


Captulo 3 Listas Lineares 73

3.2.2 insero de um novo nodo


A seguir, so analisadas separadamente as trs possveis posies para inser-
o de um novo nodo: no incio, no final e no meio da lista. Conforme visto
na Seo 3.1.2, poder ser necessrio deslocar parte ou toda a lista existente
para abrir espao para o novo nodo.

Insero no incio da lista. Caso a lista no inicie na primeira posio dis-


ponvel no arranjo (indicada pelo ndice IA), a insero de um novo nodo no
incio da lista feita na posio anterior primeira ocupada pela lista, sen-
do isto indicado no campo correspondente do descritor (IL). A Figura 3.12
ilustra esta situao. Caso no arranjo no haja espao disponvel antes do
primeiro nodo, todos os outros nodos da lista devem ser deslocados para a
frente, de modo a abrir espao na frente (Figura 3.13). Isto s poder ser feito
se houver espao no final.

Insero no final da lista. De forma semelhante insero no incio,


caso haja espao disponvel no final da lista, a insero feita logo aps a
ltima posio ocupada, indicando no descritor que o final da lista avana
uma posio (Figura 3.14). Caso no haja espao no final da lista, mas

Inserir IA IL N FL FA
no incio
DL 1 3 4 6 10

1 2 3 4 5 6 7 8 9 10

LL

IA IL N FL FA

DL 1 2 5 6 10

1 2 3 4 5 6 7 8 9 10

LL

Figura 3.12 Insero no incio de lista, com descritor.


74 Estruturas de Dados

IA IL N FL FA
Inserir
no incio DL 1 1 5 5 10

1 2 3 4 5 6 7 8 9 10

LL

IA IL N FL FA

DL 1 1 6 6 10

1 2 3 4 5 6 7 8 9 10

LL

Figura 3.13 Insero no incio de lista, com descritor.

exista alguma posio disponvel no incio do arranjo, ser necessrio des-


locar todos os outros nodos para baixo de modo a abrir espao no final
(Figura 3.15).

IA IL N FL FA Inserir
no final
DL 1 3 4 6 10

1 2 3 4 5 6 7 8 9 10

LL

IA IL N FL FA

DL 1 3 5 7 10

1 2 3 4 5 6 7 8 9 10

LL

Figura 3.14 Insero no final de lista, com descritor.


Captulo 3 Listas Lineares 75

IA IL N FL FA Inserir
no final
DL 1 6 5 10 10

1 2 3 4 5 6 7 8 9 10

LL

IA IL N FL FA

DL 1 5 6 10 10

1 2 3 4 5 6 7 8 9 10

LL

Figura 3.15 Insero no final de lista com descritor, com deslocamento.

Insero no meio da lista. Na insero no meio de uma lista sempre haver


necessidade de deslocamento de nodos, para cima ou para baixo. O proce-
dimento de insero pode ser otimizado fazendo este deslocamento do lado
mais prximo da posio onde o novo nodo ser inserido (incio ou final).

A seguir apresentado um algoritmo que realiza esta operao de insero.


Ele recebe o nome do descritor (DL), as informaes a serem inseridas no
novo nodo (Info), a posio (ordem na lista) em que o novo nodo dever ser
inserido (Pos) e o nome do arranjo (LL). No final do processamento, o algo-
ritmo devolve o arranjo LL e o descritor DL atualizados, alm de informar se
foi ou no possvel realizar a insero atravs do parmetro lgico Sucesso.
A insero no ser realizada caso no haja mais espao disponvel no arranjo
para este novo nodo, ou quando a posio de insero for invlida. usada
a estratgia de inserir o primeiro nodo da lista no meio do espao disponvel,
procurando deste modo diminuir a necessidade de deslocamentos nas inser-
es posteriores.

Algoritmo 3.11 - InserirLLArrDesc


Entradas: LL (TipoLista)
DL (TipoDescr)
Info (TipoNodo)
76 Estruturas de Dados

Pos (inteiro)
Sadas: LL (TipoLista)
DL (TipoDescr)
Sucesso (lgico)
Variveis auxiliares:
K (inteiro)
IndPos (inteiro)
incio
se (DL.N = DL.FA-DL.IA+1) ou (Pos > DL.N+1) ou (Pos < 1)
ento Sucesso falso
seno incio
Sucesso verdadeiro
DL.N DL.N + 1
se Pos = 1 {INSERIR NO INCIO}
ento incio
se DL.N = 1
ento incio
DL.IL (DL.FA-DL.IA+1) div 2
DL.FL DL.IL
fim
seno se DL.IL > DL.IA
ento DL.IL DL.IL-1
seno incio
para K de DL.FL at DL.IL incr-1 faa
LL[K+1] LL[K]
DL.FL DL.FL+1
fim
LL[DL.IL] Info
fim
seno se Pos = DL.N {INSERIR COMO LTIMO}
ento incio
se DL.FL < DL.FA
ento DL.FL DL.FL+1
seno incio
para K de DL.IL at DL.FL faa
LL[K-1] LL[K]
DL.IL DL.IL-1
fim
LL[DL.FL] Info
fim
seno incio {INSERIR NO MEIO}
se DL.FL < DL.FA
ento incio
IndPos DL.IL+Pos-1
Captulo 3 Listas Lineares 77

para K de DL.FL at IndPos incr-1 faa


LL[K+1] LL[K]
DL.FL DL.FL+1
fim
seno incio
IndPos DL.IL+Pos-2
para K de DL.IL at IndPos faa
LL[K-1] LL[K]
DL.IL DL.IL1
fim
LL[IndPos] Info
fim
fim
fim

3.2.3 remoo de um nodo


A seguir analisada a operao de remoo de um nodo de uma lista, sendo
este identificado atravs de sua ordem na lista (remoo do k-simo nodo
da lista). O nodo somente poder ser removido se o valor fornecido para sua
posio corresponder efetivamente a um dos nodos da lista, ou seja, se no
for menor do que um ou maior do que o nmero de nodos da lista (N).

No algoritmo que implementa esta operao, apresentado a seguir, a remoo


realizada deslocando uma posio para baixo todos os nodos que seguem
o nodo envolvido, de modo a no deixar espao livre. Alm disso, no descri-
tor so atualizadas as indicaes de final da lista (FL) e de tamanho da lista
(N). Caso a operao de remoo resulte em uma lista vazia, os campos do
descritor utilizados para fornecer esta informao tambm so atualizados.
Alm da ordem do nodo a ser removido (K), o algoritmo deve receber o nome
do arranjo (LL) e o nome de seu descritor (DL). Ao trmino de sua execuo,
Sucesso informa se a remoo foi ou no executada com sucesso.

Algoritmo 3.12 - RemoverKLLArrDesc


Entradas: LL (TipoLista)
DL (TipoDescr)
K (inteiro)
Sadas: LL (TipoLista)
DL (TipoDescr)
Sucesso (lgico)
Varivel auxiliar: Ind (inteiro)
incio
78 Estruturas de Dados

se (K 0) ou (K > DL.N)
ento Sucesso falso
seno incio
Sucesso verdadeiro
para Ind de DL.IL+K-1 at DL.FL-1 faa
LL[Ind] LL[Ind+1]
DL.FL DL.FL-1
DL.N DL.N-1
se DL.FL = DL.IL1
ento DL.IL DL.FL 0
fim
fim

De forma semelhante remoo de um nodo de uma lista sem descritor, esta


operao pode ser otimizada fazendo o deslocamento para o lado que apre-
sente o menor nmero de nodos, atualizando adequadamente o descritor.

3.2.4 acesso a um nodo


Novamente podem ser consideradas duas situaes: o acesso a um determi-
nado nodo a partir de sua posio dentro da lista, ou a partir de uma infor-
mao contida no nodo.

acesso ao k-simo nodo de um lista com descritor


Para acessar um nodo definido por sua posio na lista necessrio fornecer
o nome do arranjo que implementa a lista (LL) e o nome de seu descritor (DL),
alm da posio do nodo na lista (K). O algoritmo apresentado a seguir devol-
ve as informaes contidas na posio correspondente do arranjo atravs do
parmetro InfoNodo. No final, o parmetro Sucesso ter valor falso caso a
posio fornecida no esteja compreendida na lista, no tendo sido possvel
acessar o nodo requerido.

Algoritmo 3.13 - AcessarKLLArrDesc


Entradas: LL (TipoLista)
DL (TipoDescr)
K (inteiro)
Sadas: InfoNodo (TipoNodo)
Sucesso (lgico)
incio
Captulo 3 Listas Lineares 79

se (K 0) ou (K > DL.FL-DL.IL+1) ou (DL.N = 0)


ento Sucesso falso
seno incio
InfoNodo LL[DL.IL+K-1]
Sucesso verdadeiro
fim
fim

acesso a nodo identificado atravs de campo de


informao
Utilizando novamente o TipoNodo anteriormente definido, consideremos a
operao de acesso a um nodo a partir da busca de um determinado valor
contido em seu campo de informao. Supondo uma lista no ordenada,
o algoritmo a seguir devolve a Posio (o ndice no arranjo) do nodo cujo
campo Valor seja igual ao valor buscado, passado como parmetro (Val-
Buscado). Caso esta informao no seja encontrada no arranjo, retornada
Posio zero, assumindo que o espao disponvel para esta lista no arranjo
no apresente algum elemento com este ndice. O algoritmo deve receber,
ainda, o nome do arranjo (LL) sobre o qual a lista est implementada, e o
nome do descritor da lista (DL).

Algoritmo 3.14 - PosValLLArrDesc


Entradas: LL (TipoLista)
DL (TipoDescr)
ValBuscado (TipoValor)
Sada: Posio (inteiro)
Variveis auxiliares:
I (inteiro)
Achou (lgico)
incio
Achou falso
Posio 0
I DL.IL
enquanto (I DL.FL) e (no Achou)
faa se LL[I].Valor = Val
ento incio
Posio I
Achou verdadeiro
fim
seno I I+1
fim
80 Estruturas de Dados

3.3 listas lineares com ocupao


circular do arranjo
Quando uma lista linear implementada sobre um arranjo, a sucessiva inclu-
so e remoo de nodos pode levar a uma situao em que o final da lista
esteja na ltima posio do arranjo, restando ainda espao livre no seu incio.
Uma nova incluso no final da lista no seria possvel, a menos que todos os
nodos fossem deslocados para baixo, de modo a disponibilizar espao no
final da lista. Uma forma de simplificar este gerenciamento fazendo uma
ocupao circular do arranjo: o novo nodo, no final da lista, seria includo
na primeira posio do arranjo, sinalizando atravs do indicador de final de
lista (FL) o ndice desta posio.

No caso de ocupao circular de um arranjo, o ndice de final da lista poder


ser menor do que o ndice de incio da lista. A Figura 3.16 ilustra este tipo de
ocupao do arranjo LL, representando uma lista de 6 nodos, que inicia no
ndice 9 (primeiro nodo da lista) e termina no ndice 4 (ltimo nodo da lista).

A ocupao circular do arranjo altera os algoritmos que implementam as


operaes sobre esta lista. A seguir so apresentados os algoritmos que im-
plementam as operaes bsicas, considerando a possibilidade de ocupao
circular do espao disponvel no arranjo, para listas sem descritor.

3.3.1 criao de uma lista linear vazia


A possibilidade de ocupar circularmente o arranjo no vai influir no procedi-
mento de inicializao da lista (Algoritmo 3.1).

3.3.2 insero de um novo nodo


A possibilidade de ocupar circularmente o espao disponvel para a lista influi
diretamente nos procedimentos que implementam esta operao. Todas as

IA FL IL FA
1 2 3 4 5 6 7 8 9 10

LL
L3 L4 L5 L6 L1 L2

Figura 3.16 Ocupao circular do arranjo.


Captulo 3 Listas Lineares 81

configuraes devem ser analisadas, para contemplar a ocupao circular do


espao disponvel.

No caso de insero de um novo nodo no incio de uma lista, caso haja espa-
o para tal, nunca ser necessrio o deslocamento de nodos: se a lista iniciar
na primeira posio disponvel da rea reservada para a lista, o nodo ser in-
serido na ltima posio disponvel. Quando a insero for no final da lista, se
a lista terminar na ltima posio do arranjo, o nodo ser inserido na primeira
posio. Os ndices IL e FL informam, respectivamente, onde inicia e onde
termina a lista aps a insero.

O deslocamento de nodos inevitvel na insero em uma posio no meio


da lista. Esta situao ilustrada na Figura 3.17, com a insero de um novo
nodo na quinta posio da lista, sendo os nodos acima desta posio deslo-
cados uma posio para cima.

A seguir apresentado um algoritmo que executa esta operao. O algoritmo


deve receber a posio (ordem na lista) em que o nodo deve ser inserido (K),
o valor que vai compor o campo de informao do novo nodo (InfoNodo),
alm das informaes sobre nome do arranjo e ndices dos limites da rea
disponvel para a lista (IA e FA) e dos limites da lista (IL e FL). Ao final de sua
execuo, o parmetro Sucesso retorna verdadeiro se a insero foi executa-
da com sucesso, caso contrrio retorna falso.

Inserir
Posio: 5 nodo
IA IL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L3 L4 L5 L6 L1 L2

IA IL FL FA
1 2 3 4 5 6 7 8 9 10

LL
L3 L4 L5 L6 L7 L1 L2

Figura 3.17 Insero no meio de uma lista, com ocupao circular do arranjo.
82 Estruturas de Dados

O algoritmo inicialmente verifica se possvel inserir o novo nodo, calculando


o nmero de nodos que a lista apresenta (N). Com base neste valor, verifica se
ainda existe espao livre no arranjo, e se a ordem na lista onde o nodo deve
ser inserido vlida. No caso de ser possvel inserir o nodo, o algoritmo ana-
lisa diversas posies diferentes de insero (primeiro nodo da lista, no incio
da lista, no final, ou em uma posio intermediria) e, para cada uma delas,
calcula a posio de insero (Pos), atualizando os ndices de incio e de fi-
nal da lista. Finalmente, o novo nodo inserido na posio Pos calculada.
Deslocamentos para abrir espao para o novo nodo so necessrios somente
quando a insero realizada no meio da lista.

Algoritmo 3.15 - InserirLLCirArrPosK


Entradas: LL (TipoLista)
IA, FA, IL, FL (inteiro)
K (inteiro)
InfoNodo (TipoNodo)
Sadas: LL (TipoLista)
IL, FL (inteiro)
Sucesso (lgico)
Variveis auxiliares: Ind, N, Pos (inteiro)
incio
se IL = 0 {LISTA VAZIA}
ento N 0
seno se IL FL
ento N FL-IL+1
seno N (FA-IL+1) + (FL-IA+1)
se (N = FA-IA+1) ou (K > N+1) ou (K < 1) ou (N=0 e K1)
ento Sucesso falso
seno incio
se (N = 0)
ento incio {PRIMEIRO NODO}
Pos IA
IL FL IA
fim
seno incio
se (IL+K-1 FA)
ento Pos IL+K-1
seno Pos (IA-1) + (K - (FA-IL+1))
se K = 1 {INSERO NO INCIO}
ento se IL > IA
ento incio
Pos IL-1
IL IL-1
Captulo 3 Listas Lineares 83

fim
seno incio
IL FA
Pos FA
fim
seno se K = N+1 {INSERO NO FINAL}
ento se Pos = FL+1
ento FL FL+1
seno FL IA
seno {INSERO NO MEIO}
se (IL FL) e (FL < FA)
ou (IL > FL) e (Pos < IL)
ento incio
para Ind de FL incr-1 at Pos faa
LL[Ind+1] LL[Ind]
FL FL+1
fim
seno incio
se FL FA
ento para Ind de FL incr-1 at IA
faa LL[Ind+1] LL[Ind]
LL[IA] LL[FA]
para Ind de FA-1 incr-1 at Pos
faa LL[Ind+1] LL[Ind]
se FL = FA
ento FL IA
seno FL FL+1
fim
fim
LL[Pos] InfoNodo
Sucesso verdadeiro
fim
fim

3.3.3 remoo de um nodo


A ocupao circular do arranjo influi na remoo, na medida em que ao efe-
tuar a remoo, o restante da lista deve ser atualizado. Um algoritmo corres-
pondente operao de remoo do k-simo nodo de uma lista circular
apresentado a seguir. Ele deve receber a ordem do nodo a ser removido (K), o
nome do arranjo e os ndices de controle da lista e do espao a ser ocupado
no arranjo. A remoo somente poder ser realizada caso esta ordem esteja
compreendida dentro da lista.
84 Estruturas de Dados

O algoritmo inicia calculando o nmero de nodos da lista (N). Com base neste
valor, verifica se a ordem do nodo a ser removido vlida. Se a ordem estiver
correta, calcula a posio do nodo a ser removido (Pos). Em seguida, analisa
as diferentes posies do nodo a ser removido (o nico nodo, o primeiro
nodo, o ltimo nodo, ou um nodo no meio da lista), fazendo o deslocamento
dos demais nodos para manter a contigidade da lista, e atualizando o indi-
cador de final de lista.

Algoritmo 3.16 - RemoverKLLCirArr


Entradas: LL (TipoLista)
IA, FA, IL, FL (inteiro)
K (inteiro)
InfoNodo (TipoNodo)
Sadas: LL (TipoLista)
IL, FL (inteiro)
Sucesso (lgico)
Variveis auxiliares: Ind, N, Pos (inteiro)
incio
se IL = 0 {LISTA VAZIA}
ento N 0
seno se IL FL
ento N FL-IL+1
seno N (FA-IL+1) + (FL-IA+1)
se (N = 0) ou (K 0) ou (K > N)
ento Sucesso falso
seno incio
se N = 1 {REMOO DO NICO}
ento IL FL 0
seno se K = 1 {REMOO DO PRIMEIRO}
ento se IL < FA
ento IL IL+1
seno IL IA
seno se K = N {REMOO DO LTIMO}
ento se FL = IA
ento FL FA
seno FL FL-1
seno incio {REMOO NO MEIO}
se (IL+K-1 FA)
ento Pos IL+K-1
seno Pos IA + (K - (FA-IL+1)-1)
se (IL < FL) ou ((IL>FL) e (K>=FA-IL+2))
ento incio
para Ind de Pos at FL-1
Captulo 3 Listas Lineares 85

faa LL[Ind] LL[Ind+1]


FL FL-1
fim
seno incio
para Ind de Pos+1 at FA
faa LL[Ind-1] LL[Ind]
LL[FA] LL[IA]
se FL IA
ento para Ind de IA+1 at FL
faa LL[Ind-1] LL[Ind]
se FL = IA
ento FL FA
seno FL FL-1
fim
fim
Sucesso verdadeiro
fim
fim

3.3.4 acesso a um nodo


A seguir sero analisadas as duas formas bsicas para acessar um nodo de
uma lista: atravs da posio relativa do nodo na lista ou atravs do contedo
de algum campo do nodo.

acesso a nodo identificado por sua ordem na lista


O algoritmo que faz este acesso necessita receber as informaes que dizem
respeito ao arranjo (seu nome e os ndices de seu incio e final da rea dis-
ponvel para a lista), as informaes relativas lista (seu incio e seu final) e a
ordem na lista do nodo a ser acessado (K). A operao somente poder ser
executada se a ordem do nodo a ser acessado corresponder a um nodo da lis-
ta. Ao final da execuo, o algoritmo informa se a operao teve Sucesso e,
caso tenha encontrado o nodo buscado, retorna o seu campo de informao
atravs do parmetro InfoNodo.

Inicialmente calculado o nmero de nodos da lista (N), para verificar se o


valor recebido para a ordem do nodo a ser acessado vlido (K). Caso seja v-
lido, o algoritmo calcula a posio em que se localiza o nodo (Pos), conside-
rando a ocupao circular do arranjo. O acesso ao nodo feito diretamente
pela sua posio.
86 Estruturas de Dados

Algoritmo 3.17 - AcessarKLLCirArr


Entradas: LL (TipoLista)
IA, FA, IL, FL (inteiro)
K (inteiro)
Sadas: InfoNodo (TipoNodo)
Sucesso (lgico)
Variveis auxiliares: N, Pos (inteiro)
incio
se IL = 0 {LISTA VAZIA}
ento N 0
seno se IL FL
ento N FL-IL+1
seno N (FA-IL+1) + (FL-IA+1)
se (N = 0) ou (K 0) ou (K > N)
ento Sucesso falso
seno incio
se (IL+K-1 FA)
ento Pos IL+K-1
seno Pos IA + (K - (FA-IL+1)-1)
InfoNodo LL[Pos]
Sucesso verdadeiro
fim
fim

acesso a nodo identificado atravs de seu contedo


A identificao de um nodo a partir de seu contedo feita percorrendo a
lista, a partir de seu incio, at que o nodo buscado seja encontrado ou at o
final da lista.

A seguir apresentado um algoritmo que localiza o nodo que contm um de-


terminado valor ValBuscado em uma lista implementada sobre um arranjo,
considerando que o espao disponvel deste arranjo utilizado de maneira
circular. utilizado novamente o tipo de nodo definido na seo 3.1.3, com
dois campos de informao, Valor (onde est o valor buscado) e Info (res-
tante das informaes no nodo). O algoritmo devolve a Posio (o ndice
no arranjo) do nodo para o qual o campo Valor igual ao valor buscado.
Caso esta informao no seja encontrada no arranjo, devolve Posio igual
a zero, o que limita a utilizao desta funo para os casos em que o espao
disponvel para esta lista no arranjo no inclua o ndice nulo. O algoritmo
deve receber, ainda, o nome do arranjo que implementa a lista, e os ndices
de incio e de final da lista e da rea disponvel sobre o arranjo.
Captulo 3 Listas Lineares 87

Inicialmente calculado o nmero de nodos da lista (N), para verificar se a


lista no est vazia. Caso isto no ocorra, passa a ser executada a busca.
A busca feita em todos os nodos, a partir do primeiro da lista. Quando
alcanado o nodo que est no final da rea do arranjo (FA), o prximo a ser
examinado aquele que est no incio da rea (IA). Este algoritmo no consi-
dera ordenao nos valores contidos no campo Valor dos nodos.

Algoritmo 3.18 - PosValLLCirArr


Entradas: LL (TipoLista)
IA, FA, IL, FL (inteiro)
ValBuscado (TipoValor)
Sada: Posio (inteiro)
Variveis auxiliares:
N, I (inteiro)
Achou, Sair (lgico)
incio
Achou falso
Posio 0
se IL = 0 {LISTA VAZIA}
ento N 0
seno se IL FL
ento N FL-IL+1
seno N (FA-IL+1) + (FL-IA+1)
se N 0
ento incio
I IL
Sair falso
enquanto (no Achou) e (no Sair)
faa se LL[I].Valor = Val
ento incio
Posio I
Achou verdadeiro
fim
seno se I = FL
ento Sair verdadeiro
seno se I FA
ento I I+1
seno I IA
fim
fim
88 Estruturas de Dados

3.4 listas lineares encadeadas


Nas sees anteriores foi visto que se pode utilizar um arranjo para representar
um conjunto de dados contguos. O arranjo uma das formas de represen-
tao de listas que aproveita a seqencialidade da memria, ou seja, ocupa
um espao contguo na memria e permite acessar qualquer um de seus ele-
mentos. Entretanto, no uma estrutura muito flexvel, pois necessrio fazer
uma estimativa do nmero mximo de nodos da lista. Uma alternativa usar
uma estrutura de dados que cresa conforme seja necessrio inserir novos
nodos e que igualmente diminua quando nodos anteriormente inseridos so
excludos. Essas estruturas de dados so denominadas estruturas dinmi-
cas e armazenam cada nodo da lista por alocao dinmica de memria.

Uma forma de implementar estruturas dinmicas atravs do encadeamento,


onde os nodos so ligados entre si para indicar a ordem existente entre eles.
Assim, a ordem dos nodos definida por uma informao contida no prprio
nodo, que informa qual o prximo nodo da lista. Esta informao est con-
tida em um campo denominado campo de elo. Os nodos de uma lista enca-
deada podem estar alocados em quaisquer posies na memria, contguas
ou no, uma vez que a ordem fornecida explicitamente atravs do campo
de elo, sendo totalmente independente de sua posio fsica. Dessa forma, a
contigidade de uma lista linear encadeada lgica.

A forma mais comum de implementar listas encadeadas utilizando, no cam-


po de elo, diretamente o endereo fsico do prximo nodo da lista. As lingua-
gens de programao disponibilizam variveis que podem armazenar endere-
os fsicos, geralmente denominadas de ponteiros (apontadores). O programa
de aplicao no tem acesso direto ao endereo contido em uma varivel do
tipo ponteiro, mas permite que este endereo seja testado e utilizado para al-
canar o prximo nodo da lista. Assim, o espao total de memria gasto pela
estrutura proporcional ao nmero de nodos armazenados na lista.

A Figura 3.18 apresenta graficamente uma lista linear encadeada de quatro


nodos, na qual o ponteiro PtLista contm o endereo do primeiro nodo
da lista. Em cada nodo, o campo Elo aponta para o endereo do prximo
nodo (indicado graficamente atravs de uma seta). O ltimo nodo da lista
apresenta, atravs de uma linha inclinada no campo Elo, um endereo nulo
representando o final da lista, ou seja, indicando que o campo de elo no
est apontando para outro nodo.
Captulo 3 Listas Lineares 89

Info Elo

Li

PtLista Nodo genrico

L1 L2 L3 L4

Figura 3.18 Lista encadeada.

Uma lista linear implementada atravs de encadeamento deve apresentar


obrigatoriamente:

um ponteiro para o primeiro nodo da lista, atravs do qual a lista pode


ser acessada. Atravs deste ponteiro feito todo o acesso lista. Pode ser
uma varivel simples do tipo ponteiro, ou um campo (do tipo ponteiro) de
alguma varivel complexa;
encadeamento entre os nodos, atravs de algum campo de elo; e
uma indicao de final da lista. Este endereo nulo dever ser passvel de
teste, para que os algoritmos possam detectar quando o final da lista foi
alcanado.

A seguir so apresentados os algoritmos relativos s operaes bsicas que


podem ser executadas sobre listas lineares, quando implementadas atravs
de encadeamento. Os seguintes tipos de dados so utilizados nos algoritmos
apresentados:

TipoPtNodo = TipoNodo
TipoNodo = registro
Info: TipoInfoNodo
Elo : TipoPtNodo
fim registro

3.4.1 criao de uma lista linear encadeada


Antes de iniciar a construo da lista, o ponteiro que indica seu primeiro ele-
mento deve ser inicializado com um endereo nulo, indicando que a lista est
vazia. No procedimento que realiza esta inicializao, apresentado a seguir,
este ponteiro denominado PtLista.
90 Estruturas de Dados

Algoritmo 3.19 InicializarLLEnc


Entradas:
Sada: PtLista (TipoPtNodo)
incio
PtLista nulo
fim

3.4.2 insero de um novo nodo


Para inserir um nodo em uma lista encadeada deve-se, inicialmente, alocar o
novo nodo e preench-lo com o valor correspondente. Caso no se consiga
alocar um novo nodo por falta de espao fsico, isto deve ser informado ao
usurio. Em seguida, o novo nodo deve ser inserido na posio solicitada na
lista, o que requer to somente a adequao dos campos de elo dos nodos
que vo ficar antes e depois deste novo nodo: o campo de elo do nodo ante-
rior dever apontar para o novo nodo, e o campo de elo do novo nodo dever
conter o endereo do prximo na lista. Nunca haver necessidade de deslocar
nodos de sua posio fsica para efetivar a insero do novo nodo, como fre-
qentemente acontecia no caso da implementao atravs de contigidade
fsica visto anteriormente.

Em seguida so analisadas as trs posies em que o nodo pode ser inserido:


no incio da lista, no final, e em uma posio intermediria.

Insero no incio da lista encadeada. Para inserir o novo nodo no incio


da lista deve-se, aps alocar o nodo e preench-lo com o valor corresponden-
te, apontar seu campo de elo para o endereo daquele que era o primeiro e
atualizar o ponteiro de incio da lista para o novo nodo. Caso a lista esteja
vazia, este passar a ser seu nico nodo.

A Figura 3.19 mostra a insero de um novo nodo no incio de uma lista que
tinha trs nodos. O novo nodo passar a ocupar a primeira posio, sendo
agora este o nodo indicado pelo ponteiro da lista PtLista. O campo de elo
do nodo inserido apontar para aquele que era antes o primeiro nodo da
lista, que agora passa a ser o segundo.

A seguir apresentado um algoritmo que realiza a insero de um novo nodo


no incio de uma lista linear encadeada. Ele recebe o endereo do primeiro nodo
da lista (PtLista) e os Dados com os quais dever ser preenchido o campo de
informaes do novo nodo. O parmetro Sucesso retorna falso caso no seja
Captulo 3 Listas Lineares 91

PtLista
Novo nodo
L1 L2 L3

PtLista

L1 L2 L3 L4

Figura 3.19 Insero no incio de uma lista encadeada.

possvel alocar o novo nodo. Caso a insero seja realizada, o ponteiro para o
incio da lista (PtLista) atualizado para o novo nodo inserido.

Algoritmo 3.20 - InserirIniLLEnc


Entradas: PtLista (TipoPtNodo)
Dados (TipoInfoNodo)
Sadas: PtLista (TipoPtNodo)
Sucesso (lgico)
Varivel auxiliar: Pt (TipoPtNodo)
incio
alocar(Pt)
se Pt = nulo
ento Sucesso falso
seno incio
Sucesso verdadeiro
Pt.Info Dados
Pt.Elo PtLista
PtLista Pt
fim
fim

Insero no final da lista encadeada. A insero de um novo nodo no


final da lista requer somente encadear aquele que era o ltimo nodo da lista
com o novo nodo, ou seja, fazer com que seu campo de elo aponte para o
endereo onde foi alocado o novo nodo, conforme mostrado na Figura 3.20.
O ponteiro que guarda o incio da lista somente ser afetado no caso em que
a lista era vazia, quando ento apontar para este novo nodo.
92 Estruturas de Dados

PtLista
Novo nodo
L1 L2 L3

PtLista

L1 L2 L3 L4

Figura 3.20 Insero no final de uma lista encadeada.

Para alcanar o ltimo nodo da lista, necessrio percorr-la, a partir de seu


primeiro nodo. A necessidade de percorrer uma lista encadeada aparece em
muitas aplicaes, com o objetivo de procurar um determinado nodo ou de
realizar alguma operao em alguns ou todos os nodos (procurar alguma
informao, imprimir contedo, alterar valor, etc.). Isto pode ser feito com
o auxlio de uma varivel auxiliar, do tipo ponteiro, que inicialmente assume
o endereo do primeiro nodo da lista, avanando progressivamente para os
prximos nodos atravs dos campos de elo, at alcanar o final da lista, indi-
cado pelo campo de elo nulo.

O algoritmo apresentado a seguir realiza a insero no final da lista, retor-


nando Sucesso com valor falso somente no caso de no existir espao fsico
para alocar o novo nodo. utilizada uma varivel do tipo ponteiro (P1) para
guardar o endereo do novo nodo, e outra (P2) para percorrer a lista at o
ltimo nodo, identificado por ter o campo de elo nulo. Caso a lista esteja ini-
cialmente vazia, o novo nodo ser indicado pelo ponteiro da lista (PtLista).

Algoritmo 3.21 - InserirFimLLEnc


Entradas: PtLista (TipoPtNodo)
Dados (TipoInfoNodo)
Sadas: PtLista (TipoPtNodo)
Sucesso (lgico)
Variveis auxiliares: P1, P2 (TipoPtNodo)
incio
alocar(P1)
se P1 = nulo
ento Sucesso falso
Captulo 3 Listas Lineares 93

seno incio
Sucesso verdadeiro
P1.Info Dados
P1.Elo nulo
se PtLista = nulo
ento PtLista P1
seno incio
P2 PtLista
enquanto P2.Elo nulo
faa P2 P2.Elo
P2.Elo P1
fim
fim
fim

Insero no meio da lista encadeada. A insero de um novo nodo no


meio de uma lista encadeada feita adequando os campos de elo dos nodos
anterior e posterior ao novo nodo. A Figura 3.21 mostra como feita a in-
sero de um nodo na terceira posio de uma lista que originalmente tinha
trs nodos.

A seguir apresentado um algoritmo que executa esta operao. Ele recebe,


como parmetro, a ordem que o novo nodo dever ocupar na lista (K), alm
do endereo do incio da lista e dos dados a serem inseridos no novo nodo.
O parmetro Sucesso retorna falso quando no existir espao fsico para

Novo nodo
PtLista

L1 L2 L3

PtLista
L3

L1 L2 L4

Figura 3.21 Insero no meio de uma lista encadeada.


94 Estruturas de Dados

alocar o novo nodo, ou quando a posio requerida para insero no for


compatvel com o nmero de nodos da lista. No caso da insero ter sucesso,
o ponteiro PtAnt percorre a lista at o nodo anterior posio de insero,
sendo feito o ajuste de seu campo de elo para o novo nodo (PtNovo), e
do campo de elo do novo nodo para aquele que era apontado pelo nodo
anterior (PtAnt). Ressaltamos que esse algoritmo pode ser utilizado para a
insero de um nodo em qualquer posio da lista, incluindo a primeira e a
ltima posies.

Algoritmo 3.22 - InserirKLLEnc


Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Sadas: PtLista (TipoPtNodo)
Sucesso (lgico)
Variveis auxiliares: PAnt, PtNovo (TipoPtNodo)
incio
alocar(PtNovo)
se PtNovo = nulo
ento Sucesso falso
seno se ((PtLista = nulo) e (K 1)) ou (K < 1)
ento incio
liberar(PtNovo)
Sucesso falso
fim
seno se K = 1
ento incio
PtNovo.Info Dados
PtNovo.Elo PtLista
PtLista PtNovo
Sucesso verdadeiro
fim
seno incio
PtAnt PtLista
enquanto (PtAnt.Elo nulo) e (K > 2)
faa incio
PtAnt PtAnt.Elo
K K - 1
fim
se K > 2
ento incio
liberar(PtNovo)
Sucesso falso
Captulo 3 Listas Lineares 95

fim
seno incio
PtNovo.Info Dados
PtNovo.Elo PtAnt.Elo
PtAnt.Elo PtNovo
Sucesso verdadeiro
fim
fim
fim

3.4.3 remoo de um nodo


A remoo de um nodo de uma lista linear encadeada feita simplesmen-
te mudando o encadeamento dos nodos anterior e posterior ao nodo a ser
removido: o nodo imediatamente anterior apontar para aquele que era o
seguinte do nodo excludo da lista. Caso o nodo liberado seja o primeiro, o
endereo do segundo dever ser copiado para o ponteiro de incio da lista.
Caso seja o ltimo, o anterior dever ficar com campo de elo nulo. Aps este
encadeamento, que garante a continuidade da lista, a posio ocupada pelo
nodo removido liberada. A Figura 3.22 mostra a remoo do terceiro nodo
(K = 3) de uma lista de quatro nodos. Para implementar esta operao, a lista
deve ser percorrida a partir do seu primeiro nodo, indicado pelo ponteiro
PtLista, com a finalidade de localizar o nodo a ser removido.

O prximo algoritmo remove um nodo identificado pela sua posio na lista


(K). Sucesso retorna falso caso a ordem solicitada seja menor do que o pri-
meiro nodo da lista. A partir do endereo do primeiro nodo da lista, esta

PtLista

L1 L2 L3 L4

PtLista

L1 L2 L4

Figura 3.22 Remoo de um nodo de uma lista linear encadeada.


96 Estruturas de Dados

percorrida at que seja alcanado o nodo de ordem K, ou que seja alcanado


o final da lista neste ltimo caso, a ordem solicitada est fora da lista, re-
tornando Sucesso falso. Uma vez localizado o nodo a ser removido, o nodo
anterior a ele (cujo endereo foi guardado durante o percurso da lista, no
ponteiro PtAnt) encadeado com o nodo seguinte quele que foi excludo.
Caso o nodo a ser removido seja o primeiro, o endereo de acesso lista
atualizado.

Algoritmo 3.23 - RemoverKLLEnc


Entradas: PtLista (TipoPtNodo)
K (inteiro)
Sadas: PtLista (TipoPtNodo)
Sucesso (lgico)
Variveis auxiliares: PtAnt, PtK (TipoPtNodo)
incio
se K < 1
ento Sucesso falso
seno incio
PtK PtLista
PtAnt nulo
enquanto (PtK nulo) e (K > 1)
faa incio
K K-1
PtAnt PtK
PtK PtK.Elo
fim
se PtK = nulo
ento Sucesso falso
seno incio
se PtK = PtLista
ento PtLista PtLista.Elo
seno PtAnt.Elo PtK.Elo
liberar(PtK)
Sucesso verdadeiro
fim
fim
fim

3.4.4 acesso a um nodo

O acesso a um determinado nodo de uma lista encadeada requer que a lista


seja percorrida, a partir de seu primeiro nodo, at o nodo buscado. Este nodo
Captulo 3 Listas Lineares 97

pode ser identificado atravs de alguma informao nele contida, ou pela


sua ordem na lista. Diferentemente do caso de alocao de uma lista sobre
um arranjo, no existe, no caso de lista encadeada, a possibilidade de acessar
diretamente algum nodo, sem que ele seja alcanado percorrendo a lista a
partir de seu primeiro nodo.

O algoritmo a seguir tem por finalidade localizar um determinado nodo de


uma lista linear encadeada, identificado pela sua ordem na lista (K), devolven-
do o endereo fsico deste nodo (PtK) ao programa que o acionou. Caso a
posio do nodo no seja compatvel com o tamanho da lista, ou a lista esteja
vazia, PtK retorna o endereo nulo.

Algoritmo 3.24 - AcessarKLLEnc


Entradas: PtLista (TipoPtNodo)
K (inteiro)
Sada: PtK (TipoPtNodo)
incio
se (K < 1) ou (PtLista = nulo)
ento PtK nulo
seno incio
PtK PtLista
enquanto (PtK nulo) e (K > 1)
faa incio
K K-1
PtK PtK.Elo
fim
se K > 1
ento PtK nulo
fim
fim

3.4.5 destruio de uma lista linear encadeada


Caso uma lista linear encadeada no seja mais necessria durante a execuo
de uma aplicao, as posies ocupadas por ela devem ser liberadas. Isto
feito percorrendo a lista a partir de seu primeiro nodo, liberando cada uma
das posies ocupadas pelos nodos. No final, a varivel do tipo ponteiro que
faz referncia lista (PtLista) dever conter o endereo nulo. O procedi-
mento que realiza esta operao apresentado a seguir.

Algoritmo 3.25 - DestruirLLEnc


Entrada: PtLista (TipoPtNodo)
98 Estruturas de Dados

Sada: PtLista (TipoPtNodo)


Varivel auxiliar: Pt (TipoPtNodo)
begin
enquanto PtLista nulo
faa incio
Pt PtLista
PtLista PtLista.Elo
liberar(Pt)
fim
liberar(PtLista)
fim

3.5 lista encadeada circular


Quando uma lista linear encadeada apresenta um elo ligando o ltimo nodo
ao primeiro, ela se torna uma lista circular (Figura 3.23). Neste caso, qualquer
nodo pode ser utilizado para fazer acesso lista, pois toda ela pode ser per-
corrida a partir de qualquer nodo. Mesmo sendo circulares, estas listas tam-
bm apresentam um ponteiro para fazer referncia lista (PtLista), sendo o
nodo acessado em primeiro lugar identificado como o primeiro da lista.

As operaes apresentadas para listas simplesmente encadeadas podem ser


adaptadas para listas circulares. A criao da lista no alterada, uma vez
que somente o ponteiro da lista inicializado. A lista vazia quando o pon-
teiro para o seu incio nulo. Quando a lista apresenta um s nodo, seu
campo de elo aponta para ele mesmo. A operao de destruio da lista
praticamente a mesma, mudando somente a identificao do ltimo nodo a
ser liberado, que aquele que contm o endereo do primeiro em seu campo
de elo. J as operaes de insero, remoo e busca apresentam algumas
alteraes relevantes, que sero analisadas a seguir.

PtLista

L1 L2 L3 L4

Figura 3.23 Lista encadeada circular.


Captulo 3 Listas Lineares 99

3.5.1 insero de um novo nodo


Quando a lista circular, o nodo a ser inserido sempre apresentar um endere-
o no seu campo de elo, encadeando-o com o seguinte. No caso de ser o ni-
co nodo da lista, seu prprio endereo ser colocado em seu campo de elo.

O algoritmo que executa esta operao recebe, como parmetro, a ordem


que o novo nodo dever ocupar na lista (K), alm do endereo do incio da
lista e dos dados a serem inseridos no novo nodo. O retorno do parmetro
Sucesso ser falso quando no existir espao fsico para alocar o novo nodo,
ou caso a posio requerida para a insero no seja compatvel com o n-
mero de nodos da lista. A insero de um nodo como primeiro da lista recebe
tratamento diferenciado de qualquer outra posio, sendo seu endereo co-
locado no ponteiro da lista (PtLista). A insero requer que seja localizada
a posio de insero, o que feito por um ponteiro percorrendo a lista at o
nodo anterior posio de insero, realizando em seguida os encadeamen-
tos necessrios.

Algoritmo 3.26 - InserirKLLEncCir


Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Sadas: PtLista (TipoPtNodo)
Sucesso (lgico)
Variveis auxiliares: PtAnt, PtNovo (TipoPtNodo)
incio
alocar(PtNovo)
se PtNovo = nulo
ento Sucesso falso
seno se ((PtLista = nulo) e (K 1)) ou (K < 1)
ento incio
liberar(PtNovo)
Sucesso falso
fim
seno incio
Sucesso verdadeiro
PtNovo.Info Dados
se K = 1 {INSERE COMO PRMEIRO}
ento incio
se PtLista = nulo
ento PtNovo.Elo PtNovo
seno incio
100 Estruturas de Dados

PtAnt PtLista
enquanto PtAnt.Elo PtLista
faa PtAnt PtAnt.Elo
PtNovo.Elo PtLista
PtAnt.Elo PtNovo
fim
PtLista PtNovo
fim
seno incio
PtAnt PtLista
enquanto (PtAnt.Elo PtLista) e (K > 2)
faa incio
PtAnt PtAnt.Elo
K K - 1
fim
se K > 2 {ORDEM FORA DA LISTA}
ento incio
liberar(PtNovo)
Sucesso falso
fim
seno incio
PtNovo.Info Dados {INSERE NO MEIO}
PtNovo.Elo PtAnt.Elo
PtAnt.Elo PtNovo
fim
fim
fim
fim

3.5.2 remoo de um nodo


A remoo de um nodo de uma lista encadeada circular requer a localiza-
o do nodo imediatamente anterior a ele, devendo este ser encadeado ao
seguinte na lista, sendo depois liberada a posio que o nodo ocupava. Tra-
tamento diferenciado deve ser dado ao caso de remoo do primeiro nodo,
devendo ser atualizado o ponteiro da lista.

O algoritmo a seguir remove um nodo identificado pela sua ordem na lista


(K). Sucesso retorna falso caso a lista esteja vazia, ou a ordem solicitada no
esteja compreendida na lista. A lista percorrida a partir do endereo do pri-
meiro nodo da lista at que o nodo a ser removido seja alcanado. O ponteiro
PtAnt guardar o endereo do nodo anterior para que seja encadeado ao
Captulo 3 Listas Lineares 101

nodo seguinte. Caso o nodo a ser removido seja o primeiro, o endereo de


acesso lista deve ser atualizado.

Algoritmo 3.27 - RemoverKLLEncCir


Entradas: PtLista (TipoPtNodo)
K (inteiro)
Sadas: PtLista (TipoPtNodo)
Sucesso (lgico)
Variveis auxiliares: PtAnt, PtK (TipoPtNodo)
incio
se (K < 1) ou (PtLista = nulo)
ento Sucesso falso
seno incio
Sucesso verdadeiro
se K = 1
ento se PtLista.Elo = PtLista
ento incio
liberar(PtLista)
PtLista nulo
fim
seno incio
PtAnt PtLista
enquanto PtAnt.Elo PtLista
faa PtAnt PtAnt.Elo
PtAnt.Elo PtLista.Elo
liberar(PtLista)
PtLista PtAnt.Elo
fim
seno incio
PtAnt PtLista
enquanto (PtAnt.Elo PtLista) e (K > 2)
faa incio
PtAnt PtAnt.Elo
K K - 1
fim
se PtAnt.Elo = PtLista {ORDEM FORA DA LISTA}
ento Sucesso falso
seno incio
PtK PtAnt.Elo
PtAnt.Elo PtK.Elo
liberar(PtK)
fim
fim
fim
fim
102 Estruturas de Dados

3.5.3 acesso a um nodo


A principal alterao introduzida pelo fato de a lista ser encadeada circular
consiste na maneira como a lista percorrida. Quando a lista no era circu-
lar, seu ltimo nodo apresentava campo de elo nulo ao encontrar este valor
era identificado o final da lista. No caso de lista circular nunca ser encontra-
do um campo de elo nulo. O processo de percurso da lista deve ser suspenso
quando for alcanado novamente o seu primeiro nodo.

A ttulo de ilustrao apresentado a seguir um algoritmo que percorre uma


lista circular com o objetivo de realizar uma mesma operao em todos os
nodos: exibir o contedo de seu campo de informao. utilizado o mesmo
tipo de nodo das listas encadeadas anteriormente apresentadas.

Algoritmo 3.28 - ImprimirLLEncCir


Entrada: PtLista (TipoPtNodo)
Sadas: -
Varivel auxiliar: PtAux (TipoPtNodo)
incio
se PtLista = nulo
ento escrever(Lista vazia!)
seno incio
PtAux PtLista
repita
escrever(PtAux.Info)
PtAux PtAux.Elo
at que PtAux = PtLista
fim
fim

3.6 listas lineares duplamente encadeadas


Uma lista duplamente encadeada aquela que possui duas referncias ao invs
de uma, permitindo que a lista seja percorrida nos dois sentidos do incio para
o final, e do final para o incio. Para que isto seja possvel, cada nodo apresenta
dois campos de elo, um que armazena o endereo do nodo imediatamente
anterior na lista (Anterior) e o outro que armazena o endereo do nodo se-
guinte (Prximo), conforme mostrado na Figura 3.24. O primeiro nodo da lista
ter sempre o apontador para o nodo anterior no endereo nulo, e o ltimo
nodo ter endereo nulo no campo que indica o prximo nodo da lista.
Captulo 3 Listas Lineares 103

Ant Info Prx

Nodo genrico

PtLista

L1 L2 L3 L4

Figura 3.24 Lista duplamente encadeada.

A implementao das operaes fica facilitada quando utilizado o duplo


encadeamento, pelo fato de se poder percorrer a lista em qualquer direo, a
qualquer momento. Apesar desta forma de representao de lista apresentar
um nodo mais complexo, com mais informaes armazenadas, a sua facilida-
de de manipulao justifica sua grande utilizao.

A seguir so apresentados os algoritmos relativos s operaes bsicas que


podem ser executadas em listas duplamente encadeadas, sendo utilizado o
seguinte tipo de dados para os nodos:

TipoNodo = registro
Ant: TipoPtNodo
Info: TipoInfoNodo
Prox: TipoPtNodo
fim registro

Das operaes bsicas, a operao de criao da lista duplamente enca-


deada exatamente igual da lista simplesmente encadeada, pois envolve
somente a alocao e a inicializao do ponteiro que faz referncia para o
incio da lista (PtLista). Muda somente o tipo de nodo utilizado. A operao
de destruio da lista tambm no alterada. J as operaes de insero,
remoo e acesso devem ser adaptadas, sendo mostradas a seguir.

3.6.1 insero de um novo nodo


Na insero de um novo nodo em uma lista duplamente encadeada neces-
srio atualizar os campos de elo dos dois sentidos de percurso. A Figura 3.25
104 Estruturas de Dados

mostra graficamente o que deve ser feito para inserir o novo nodo na lista: (1)
no nodo que ficar antes do novo nodo, alterar o apontador para o prximo
da lista; (2) no nodo que ficar depois dele, alterar o campo que aponta para
o anterior na lista; e (3) no novo nodo, atualizar os dois campos de apontado-
res, para o prximo e para o anterior.

O algoritmo apresentado a seguir percorre a lista at o nodo aps o qual o


novo nodo deve ser inserido, utilizando para isso um ponteiro auxiliar (PtAnt).
O novo nodo, alocado em uma posio indicada por PtNovo, ento enca-
deado nos dois sentidos, com o nodo apontado por PtAnt e com aquele
que era o seguinte, cujo endereo est no campo Prox de PtAnt. Sucesso
retorna falso nos casos em que a insero no possvel: (1) caso no exista
espao para alocar o novo nodo; (2) quando a lista estiver vazia e a posio
solicitada for diferente da primeira; ou (3) quando a ordem solicitada no for
compatvel com o tamanho da lista.

Algoritmo 3.29 - InserirKLLDupEnc


Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Sadas: PtLista (TipoPtNodo)
Sucesso (lgico)

Novo nodo
PtLista

L1 L2 L3 L4

PtLista L3

L1 L2 L4 L5

Figura 3.25 Insero de um novo nodo em uma lista duplamente encadeada.


Captulo 3 Listas Lineares 105

Variveis auxiliares: PtAnt, PtNovo (TipoPtNodo)


incio
alocar(PtNovo)
se PtNovo = nulo
ento Sucesso falso
seno se ((PtLista = nulo) e (K 1)) ou (K < 1)
ento incio
liberar(PtNovo)
Sucesso falso
fim
seno se K = 1
ento incio
PtNovo.Info Dados
PtNovo.Prox PtLista
se PtLista <> nulo
ento PtLista.Ant PtNovo
PtNovo.Ant nulo
PtLista PtNovo
Sucesso verdadeiro
fim
seno incio
PtAnt PtLista
enquanto (PtAnt.Prox nulo) e (K > 2)
faa incio
PtAnt PtAnt.Prox
K K - 1
fim
se K > 2
ento incio
liberar(PtNovo)
Sucesso falso
fim
seno incio
PtNovo.Info Dados
PtNovo.Prox PtAnt.Prox
PtNovo.Ant PtAnt
PtAnt.Prox PtNovo
if PtNovo.Prox <> nulo
then PtNovo.Prox.Ant PtNovo
Sucesso verdadeiro
fim
fim
fim
106 Estruturas de Dados

3.6.2 remoo de um nodo


Todo cuidado deve ser tomado para que o duplo encadeamento no seja
perdido quando um nodo for removido da lista. A Figura 3.26 mostra grafi-
camente como deve ser realizada a operao de remoo de um nodo, quan-
do este estiver em uma posio intermediria da lista os nodos anterior e
posterior a ele so encadeados, nos dois sentidos, sendo depois liberada a
posio de memria ocupada pelo nodo a ser removido. Cuidados especiais
devem ser tomados quando o nodo a ser removido estiver em uma das extre-
midades da lista.

A implementao desta operao, mostrada a seguir, semelhante remo-


o de uma lista simplesmente encadeada: inicialmente localizado o nodo
que deve ser removido, percorrendo a lista a partir de seu primeiro nodo,
com o ponteiro PtK; em seguida, o nodo anterior a este encadeado com
o que vem a seguir, sendo ele ento removido. Caso o nodo removido seja
o primeiro da lista, atualizado o ponteiro da lista para o nodo seguinte. A
remoo no ser realizada no caso da ordem do nodo solicitado no estar
compreendida na lista, ou da lista estar vazia.

PtLista Remover

A B C D

PtLista

A B C D

Figura 3.26 Remoo de um nodo de uma lista duplamente encadeada.


Captulo 3 Listas Lineares 107

Algoritmo 3.30 - RemoverKLLDupEnc


Entradas: PtLista (TipoPtNodo)
K (inteiro)
Sadas: PtLista (TipoPtNodo)
Sucesso (lgico)
Varivel auxiliar: PtK (TipoPtNodo)
incio
se ((PtLista = nulo) e (K 1)) ou (K < 1)
ento Sucesso falso
seno incio
PtK PtLista
enquanto (PtK nulo) e (K > 1)
faa incio
K K-1
PtK PtK.Prox
fim
se PtK = nulo
ento Sucesso falso
seno incio
Sucesso verdadeiro
se PtK = PtLista
ento incio
PtLista.Ant nulo
PtLista PtLista.Prox
fim
seno incio
PtK.Ant.Prox PtK.Prox
se PtK.Prox <> nulo
ento PtK.Prox.Ant PtK.Ant
liberar(PtK)
fim
fim
fim
fim

3.6.3 acesso lista duplamente encadeada


O acesso aos nodos de uma lista duplamente encadeada ser feito sempre a
partir do seu primeiro nodo, podendo depois o percurso ser realizado nos dois
sentidos. Caso a lista seja percorrida a partir do seu incio, o acesso a um de-
terminado nodo igual ao que foi visto para a lista simplesmente encadeada.
108 Estruturas de Dados

Para ilustrar a vantagem de utilizar o duplo encadeamento, mostrada a


seguir uma aplicao que utiliza este tipo de lista encadeada para exibir o
contedo dos campos de informao de cada nodo, do final para o incio
primeiro exibido o campo de informao do ltimo nodo, depois o do
penltimo nodo, e assim por diante. Para isto, um ponteiro auxiliar (PtAux)
posicionado inicialmente no incio da lista, percorrendo-a at alcanar o
ltimo nodo. Utilizando, ento, o encadeamento para os nodos anteriores, o
mesmo ponteiro percorre novamente a lista, imprimindo os campos de infor-
mao de cada nodo.

Algoritmo 3.31 - ImprimirLLDupEncInv


Entrada: PtLista (TipoPtNodo)
Sadas: -
Varivel auxiliar: PtAux (TipoPtNodo)
incio
se PtLista = nulo
ento escrever(Lista vazia !)
seno incio
PtAux PtLista
enquanto PtAux.Prox nulo
faa PtAuxPtAux.Prox
enquanto PtAux PtLista
faa incio
escrever(PtAux.Info)
PtAux PtAux.Ant
fim
escrever(PtAux.Info)
fim
fim

3.6.4 lista duplamente encadeada, com descritor


Nos casos em que o final da lista acessado seguidamente, a utilizao de
um descritor facilita a sua manipulao, pois nele pode ser armazenado di-
retamente o endereo do ltimo nodo. A existncia do duplo encadeamento
permite que, uma vez acessado diretamente esse ltimo nodo, os demais no-
dos da lista tambm possam ser acessados. A ltima operao apresentada,
por exemplo, seria simplificada caso o acesso ao ltimo nodo fosse direto.
Assim, o descritor rene, em um nico elemento, as referncias para o incio
e para o final da lista.
Captulo 3 Listas Lineares 109

A Figura 3.27 ilustra a utilizao de um descritor com trs campos: o primei-


ro indicando o endereo do primeiro nodo da lista; o segundo, o nmero
total de nodos da lista (na figura, 4 nodos); e o terceiro, o endereo do
ltimo nodo.

O tipo deste descritor :

TipoDecrLDE = registro
Prim : TipoPtNodo
N : inteiro
Ult : TipoPtNodo
fim registro

Os algoritmos para insero, remoo e busca em uma lista duplamente enca-


deada com descritor so semelhantes aos algoritmos para listas duplamente
encadeadas, bastando somente fazer o acesso atravs do descritor e atualizar
o descritor a cada modificao efetuada na lista.

Para exemplificar a implementao de uma operao em uma lista linear du-


plamente encadeada com descritor, a seguir mostrado um algoritmo que
insere um nodo no final desta lista, pegando o endereo do ltimo nodo dire-
tamente no descritor. O procedimento supe que j foi alocado o descritor da
lista, do tipo acima definido, sendo conhecido o seu endereo PtDescrLDE.
Supe ainda que sempre seja possvel alocar um novo nodo.

Algoritmo 3.32 - InserirFimLLDupEncDesc


Entradas: PtDescr (TipoPtDescrLDE)
Valor (TipoInfoNodo)

PtDescrLDE

Prim N Ult
4

L1 L2 L3 L4

Figura 3.27 Lista duplamente encadeada, com descritor.


110 Estruturas de Dados

Sada: PtDescr (TipoPtDescrLDE)


Variveis auxiliares: PtAux, PtUlt (TipoPtNodo)
incio
alocar(PtAux)
PtAux.Info Valor;
PtAux.Prox nulo
PtDescr.N PtDescr.N + 1
se PtDescr.Ult = nulo
ento incio
PtDescr.Prim PtDescr.Ult PtAux
PtAux.Ant nulo
fim
seno incio
PtUlt PtDescr.Ult
PtUlt.Prox PtAux
PtAux.Ant PtUlt
PtDescr.Ult PtAux
fim
fim

3.7 lista duplamente encadeada circular


Uma lista duplamente encadeada pode ser, tambm, circular. Neste caso, o
primeiro nodo da lista tem como antecessor o ltimo nodo, e o ltimo, por sua
vez, tem o primeiro como seguinte. Assim, a lista pode ser percorrida em qual-
quer sentido, a partir de qualquer nodo o caso mais geral de lista linear en-
cadeada, que proporciona o acesso mais simplificado a todos os seus nodos.

Na Figura 3.28 mostrada uma lista duplamente encadeada circular, na qual


o indicador de incio da lista est apontando para o nodo L1. O acesso lista
feito sempre atravs de seu primeiro nodo. Caso se conhea a priori o n-
mero de nodos da lista, possvel escolher qual o melhor sentido de percurso

PtLista

L1 L2 L3 L4

Figura 3.28 Lista duplamente encadeada circular.


Captulo 3 Listas Lineares 111

a ser adotado, de modo a chegar mais rpido ao nodo que se quer acessar.
Por exemplo, caso a lista tenha 20 nodos, se o nodo requerido o de ordem
18, mais apropriado percorr-la de trs para frente.

Quanto implementao das operaes sobre este tipo de lista, a opera-


o de criao da lista circular similar de criao de uma lista enca-
deada qualquer, bastando inicializar o ponteiro da lista em um endereo
nulo, representando a lista vazia. A forma de acessar os nodos da lista
pouco alterada quando a lista duplamente encadeada circular, mu-
dando somente a identificao do final da lista, que quando se alcana
novamente o seu primeiro nodo. O mesmo acontece com a operao de
destruio da lista. As maiores alteraes introduzidas pelo fato de a lista
ser circular so relacionadas s operaes de insero e remoo de nodos,
apresentadas a seguir.

3.7.1 insero de um novo nodo


Na operao de insero de um novo nodo neste tipo de lista, todo cuidado
deve ser tomado para que o encadeamento entre o primeiro e o ltimo no-
dos, nos dois sentidos, no seja perdido. As operaes que inserem ou remo-
vem nodos no meio da lista no so alteradas pelo fato de a lista ser circular.
Entretanto, caso uma destas operaes envolva um dos nodos extremos da
lista, o encadeamento entre eles deve ser atualizado.

Para exemplificar, a seguir mostrada a operao de insero no final da lista.


Supondo que a lista j tenha sido criada, a operao ter sucesso sempre que
houver espao fsico para alocar o novo nodo. Caso a lista esteja inicialmente
vazia, o novo nodo ser tambm o primeiro nodo da lista. Quando a lista j
tiver algum nodo, o encadeamento do novo nodo na posio de ltimo fei-
to simplesmente atravs das informaes contidas nos campos de elo do pri-
meiro nodo, e daquele que era o ltimo. A Figura 3.29 ilustra esta situao,
incluindo um novo nodo no final da lista. O encadeamento circular facilita a
implementao desta operao, pois no preciso percorrer toda a lista para
alcanar seu final.

Algoritmo 3.33 - InserirFimLLDupEncCir


Entradas: PtDescr (TipoPtDescrLDE)
Dados (TipoInfoNodo)
Sadas: PtDescr (TipoPtDescrLDE)
Sucesso (lgico)
112 Estruturas de Dados

PtLista

L1 L2 L3 L4

L5

PtNovo

Figura 3.29 Insero no final de uma lista duplamente encadeada circular.

Varivel auxiliar: PtNovo (TipoPtNodo)


incio
alocar(PtNovo)
se PtNovo = nulo
ento Sucesso falso
seno incio
Sucesso verdadeiro
PtNovo.Info Dados
se PtLista = nulo
ento incio
PtNovo.Prox PtNovo
PtNovo.Ant PtNovo
PtLista PtNovo
fim
seno incio
Ptnovo.Ant PtLista.Ant
PtNovo.Prox PtLista
PtLista.Ant.Prox PtNovo
PtLista.Ant PtNovo
fim
fim
fim

3.7.2 remoo de um novo nodo


O fato de a lista duplamente encadeada ser circular afeta a operao de re-
moo de um nodo somente quando o nodo a ser removido for um dos
extremos da lista. Na remoo do nodo de uma das extremidades deve ser
mantido o encadeamento circular. A seguir apresentado um algoritmo que
remove o ltimo nodo de uma lista duplamente encadeada circular. Como o
endereo do ltimo nodo j est contido no campo Ant do primeiro nodo da
Captulo 3 Listas Lineares 113

lista, a implementao da operao imediata, bastando atualizar os enca-


deamentos para que o penltimo nodo passe a ser o ltimo, liberando em
seguida a posio ocupada pelo nodo a excluir. Supe-se que a lista j foi
criada. Caso a lista esteja vazia, Sucesso retornar falso. Se a lista apresentar
somente um nodo, resultar vazia.

Algoritmo 3.34 - RemoverUltLLDupEncCir


(var PtLista: TipoPtNodo): lgico;
Entradas: PtDescr (TipoPtDescrLDE)
Sadas: PtDescr (TipoPtDescrLDE)
Sucesso (lgico)
Varivel auxiliar: PtAux (TipoPtNodo)
incio
se PtLista = nulo
ento Sucesso falso
seno incio
Sucesso verdadeiro
PtAux PtLista.Ant
se PtLista.Prox = PtLista
ento PtLista nulo
seno incio
PtLista.Ant PtAux.Ant
PtAux.Ant.Prox PtLista
fim
liberar(PtAux)
fim
fim

3.7.3 lista duplamente encadeada circular, com descritor


No caso de ser requerido o acesso a um determinado nodo de uma lista du-
plamente encadeada circular, identificando este nodo atravs de sua ordem
na lista, o tempo de execuo pode ser otimizado pelo fato de a lista poder
ser percorrida nos dois sentidos. Identificando o sentido apropriado, pode-se
garantir que o percurso at alcanar este nodo seja o menor possvel. Para
isso, necessrio que seja conhecido o nmero total de nodos da lista, que
pode estar contido em um descritor desta lista.

O descritor definido na Seo 3.6.4 para uma lista duplamente encadeada


apresentava, alm de um campo contendo o nmero total de nodos da lista
(N), outros dois campos com os endereos do primeiro e do ltimo nodos da
lista. No caso aqui analisado, sendo a lista circular, somente o primeiro nodo
114 Estruturas de Dados

da lista necessrio, pois o ltimo pode ser diretamente acessado a partir


deste. No exemplo a seguir ser utilizado o seguinte descritor (Figura 3.30):

TipoPtDescrLDEC = registro
Prim : TipoPtNodo
N : inteiro
fim registro

O algoritmo a seguir acessa o nodo de ordem K da lista, devolvendo o con-


tedo de seu campo de informao (Valor). Sucesso retorna falso caso a
lista esteja vazia (quando o campo Prim de seu descritor for um endereo
nulo), ou quando a ordem do nodo solicitado estiver fora da lista, o que in-
formado diretamente pelo descritor, atravs do campo que contm o nmero
de nodos (N). Uma vez acessado o primeiro nodo da lista, um ponteiro auxi-
liar (PtAux) percorre a lista at o nodo desejado, no sentido mais adequado.

Algoritmo 3.35 - AcessarKLLDupEncCirDesc


Entradas: PtDescrLDEC (TipoPtDescrLDEC)
K (inteiro)
Sadas: Valor (TipoInfoNodo)
Sucesso (lgico)
Varivel auxiliar: PtAux (TipoPtNodo)
incio
se (PtDescrLDEC.Prim = nulo) ou (K < 1) ou (K > PtDescrLDEC.N)
ento Sucesso falso
seno incio
Sucesso verdadeiro
PtAux PtDecrLDEC.Prim
se K PtDescrLista.N / 2

PtDescrLDEC

Figura 3.30 Lista duplamente encadeada circular, com descritor.


Captulo 3 Listas Lineares 115

ento {PERCORRE DO INCIO PARA O FINAL}


enquanto K > 1
faa incio
PtAux PtAux.Prox
K K 1
fim
seno incio {PERCORRE DO FINAL PARA O INCIO}
PtAux PtAux.Ant
enquanto PtDecrLista.N K > 0
faa incio
PtAux PtAux.Ant
K K + 1
fim
fim
Valor PtAux.Info
fim
fim

3.8 consideraes gerais


No existe, a priori, uma forma considerada a melhor para implementar listas
lineares, seja atravs de contigidade fsica ou por encadeamento, com en-
cadeamento simples ou duplo, com ou sem descritor. Cada uma delas apre-
senta vantagens e desvantagens, devendo ser escolhida aquela que for mais
adequada aplicao especfica que estiver sendo implementada.

A implementao de listas lineares por contigidade fsica (sobre arranjos)


apresenta como principal vantagem o acesso direto a qualquer elemento da
lista, feito atravs do ndice no arranjo. O tempo para acessar qualquer nodo
da lista constante, dependendo somente do conhecimento prvio do ndice
a ser acessado.

Entretanto, este tipo de implementao apresenta algumas desvantagens. A


principal delas que a implementao por contigidade fsica apresenta quase
sempre a necessidade de deslocamento (movimentao de dados) quando um
elemento inserido ou excludo da lista. Alm disso, o tamanho da lista deve ser
pr-estimado, ou seja, o tamanho sempre ser limitado ao tamanho definido
para o arranjo. Sendo assim, as listas lineares implementadas por contigidade
fsica so indicadas para aplicaes que manipulam listas pequenas, cujo tama-
nho mximo possa ser previamente definido, e que apresentem como opera-
116 Estruturas de Dados

es mais freqentes consulta, insero e remoo no final da lista, evitando


deste modo a necessidade de deslocamento de nodos. Uma alternativa para
evitar o deslocamento constante dos nodos implementar a ocupao da lista
no arranjo de forma circular: o novo nodo, no final lista, pode ser includo na
primeira posio do arranjo quando sucessivas incluses e remoes levarem a
uma situao em que o final da lista esteja na ltima posio do arranjo.

A implementao de listas atravs de encadeamento gera uma estrutura mais


flexvel, prpria para aplicaes onde as listas so dinmicas, com grande
nmero de inseres e de remoes de nodos. Uma grande vantagem nestes
casos no ser necessrio dimensionar o nmero de nodos para a lista, que
vo sendo alocados dinamicamente ao longo da execuo da aplicao. Des-
te modo, a nica limitao construo da lista o tamanho disponvel da
memria do computador que implementa a aplicao.

Entretanto, os algoritmos de busca em listas lineares podem ser considerados


pouco eficientes neste tipo de implementao, pois a busca sempre deve ini-
ciar pelo primeiro elemento que, neste caso, contm o menor valor da lista.
Uma simples modificao na estrutura fsica da lista pode ser de grande auxlio:
quando o ltimo nodo da lista tem como prximo o primeiro nodo, formando
assim uma lista circular. Diversas aplicaes que necessitam representar conjun-
tos cclicos se beneficiam com a implementao de listas circulares. Por exemplo,
arestas que delimitam uma face podem ser agrupadas em uma lista circular.

A principal desvantagem da implementao de listas atravs de encadeamen-


to que o tempo de acesso pode ser bem maior do que no caso da implemen-
tao por contigidade fsica, uma vez que geralmente necessrio percorrer
a lista para encontrar um determinado nodo ou posio de insero. Esta
limitao parcialmente contornada atravs da definio de listas duplamente
encadeadas, que permitem seu percurso nos dois sentidos. Particularmente as
listas duplamente encadeadas, embora facilitem a forma de percorrer a lista,
requerem que o espao fsico utilizado seja maior devido utilizao de dois
campos de elo em cada nodo. Em aplicaes onde o nmero de nodos mui-
to elevado, este acrscimo de memria ocupada pode ser relevante.

A utilizao de um descritor que contenha algumas informaes sobre a lista,


seja na implementao por contigidade fsica ou atravs de encadeamento,
apresenta vantagens em diversas aplicaes, desde que as informaes nele
contidas sejam adequadas. Embora aumente um pouco o tempo de acesso
Captulo 3 Listas Lineares 117

lista, pois este sempre deve ser feito via descritor, sua utilizao afasta do
usurio os detalhes da implementao da lista, fazendo com que a manipula-
o da lista seja feita em um nvel mais abstrato.

3.9 exerccios

exerccios com listas lineares contigidade fsica


exerccio 1 Considere uma lista de valores inteiros e implemente um algorit-
mo que receba como parmetro dois valores (n1 e n2) e uma lista, e insira o
valor n2 aps o nodo que contm o valor n1.

exerccio 2 O algoritmo que remove um nodo com base em sua ordem na


lista (Algoritmo 3.6) pode ser otimizado da seguinte forma: se o nodo a ser
removido estiver localizado na primeira metade da lista, o deslocamento deve
ser feito para baixo; caso contrrio, o deslocamento deve ser feito para cima.
Implemente, de forma otimizada, um algoritmo que receba como parmetro
uma lista e um valor e retorne a lista resultante da excluso do elemento cuja
posio na lista foi indicada pelo parmetro valor.

exerccio 3 Construa um algoritmo que receba como parmetros uma lista


e um valor, valor este que representa a posio de um nodo na lista. O algo-
ritmo dever retornar as informaes contidas neste nodo e a lista resultante
da excluso deste nodo.

exerccio 4 O Algoritmo 3.9 implementa a busca de um nodo atravs de


algum valor de seu campo de informao, considerando uma lista ordenada
em ordem crescente de valores. Implemente uma funo que receba como
parmetro uma lista com os valores ordenados em ordem decrescente, e re-
torne a posio do nodo na lista.

exerccio 5 A seo 3.2 define um tipo de descritor, denominado TipoDes-


cr, que contm cinco campos, com as seguintes informaes: IA ndice de
incio da rea disponvel para a lista; IL ndice do primeiro nodo da lista; N
comprimento da lista; FL ndice do ltimo nodo da lista; e FA ndice do
final da rea disponvel para a lista. Construa um algoritmo que receba como
parmetro o descritor da lista, um valor que representa uma posio na lista
e um valor para ser inserido na lista; e retorne a lista resultante da incluso do
novo nodo duas posies acima do valor passado como parmetro.
118 Estruturas de Dados

exerccio 6 Considerando a lista do exerccio anterior, acessada atravs de


um descritor do tipo TipoDescr, implemente uma funo que receba como
parmetro o descritor da lista e retorne o nmero de nodos que a lista apre-
senta no momento.

exerccio 7 Defina um descritor adequado para acessar uma lista linear im-
plementada sobre um arranjo, para uma aplicao que acesse seguidamente
os nodos que apresentam o maior e o menor valor em seu campo de aplica-
o. Em seguida, implemente um algoritmo que receba como parmetro o
descritor da lista e um valor e inclua um novo nodo no final desta lista, atua-
lizando o descritor, caso seja necessrio.

exerccio 8 Implemente um algoritmo que receba como parmetro uma


lista implementada sobre um arranjo com ocupao circular, e um valor. O
algoritmo deve retornar a lista resultante da remoo do nodo que contm
este valor.

exerccio 9 Implemente uma funo que receba como parmetro uma lista
circular, implementada sobre um arranjo com ocupao circular, e retorne o
nmero de nodos que a lista apresenta no momento.

exerccios com listas lineares encadeadas


exerccio 10 Construa um algoritmo que receba, como parmetro, o ende-
reo do primeiro nodo de uma lista encadeada e um valor. O algoritmo deve
retornar: o nmero total de nodos da lista; o nmero de nodos da lista que
possuem em seu contedo o valor passado como parmetro e sua respectiva
posio na lista; e o nmero de nodos que possuem em seu contedo valores
maiores do que o valor passado como parmetro.

exerccio 11 Implemente um algoritmo que receba como parmetro um pon-


teiro para o primeiro nodo de uma lista encadeada e dois valores, e retorne a
lista resultante da troca de todas as ocorrncias do primeiro valor pelo segun-
do, ambos passados como parmetros, e o nmero total de trocas efetuadas.

exerccio 12 Implemente um algoritmo que receba como parmetro o pri-


meiro nodo de uma lista simplesmente encadeada e mostre o contedo de
todos os nodos da lista, de trs para frente. Note que a lista no duplamen-
te encadeada. Implemente esse algoritmo de forma recursiva e no recursiva,
e depois compare as duas implementaes.
Captulo 3 Listas Lineares 119

exerccio 13 Construa um algoritmo que receba como parmetro duas listas


encadeadas ordenadas e retorne a lista resultante da combinao das duas,
sendo que a lista resultante tambm deve estar ordenada.

exerccio 14 Implemente uma funo que receba como parmetro duas lis-
tas encadeadas e retorne um valor lgico que indique se as duas listas so
idnticas.

exerccio 15 Construa um algoritmo que construa uma lista encadeada re-


versa, de modo que os dados fornecidos em primeiro lugar sejam os do lti-
mo nodo, e os ltimos dados, os do primeiro.

exerccio 16 Polinmios podem ser representados por meio de listas enca-


deadas, cujos nodos so registros com trs campos: coeficiente, expoente e
uma referncia ao nodo seguinte. Implemente uma funo que receba como
parmetro X R como parmetro, e retorne o resultado do clculo de p(x).

exerccio 17 Construa um algoritmo que receba como parmetro duas listas


e um nmero inteiro N e retorne a lista resultante da insero da segunda lista
na primeira, seqencialmente, a partir da posio N da primeira lista.

exerccio 18 Considere a existncia de duas listas ordenadas, a primeira (L1)


cujos nodos so palavras e a segunda (L2) que contm um nmero em cada
nodo. Implemente um algoritmo que remova da lista L1 os nodos cujas po-
sies esto na lista L2. As posies na lista L2 variam de 1 a N. Caso algum
nodo da segunda lista apresente um valor de posio no vlido para a lista
L1, a remoo correspondente no realizada.

exerccio 19 Considere um nico ponteiro (apt) para um nodo de uma lista


simplesmente encadeada. Implemente um algoritmo que receba como par-
metro o ponteiro apt e retorne a lista resultante da excluso do nodo apon-
tado por apt, conforme ilustrado na figura a seguir:
apt

10 40 5 21 15

10 40 21 15
120 Estruturas de Dados

exerccio 20 Implemente um algoritmo que receba como parmetro uma


lista encadeada e retorne a lista resultante da inverso do encadeamento
de seus nodos. A inverso deve ser realizada de forma a no alterar a or-
dem fsica dos elementos na lista, conforme mostrado na figura a seguir:
ptLista

10 40 5 21 15

ptLista

10 40 15 21 15

exerccio 21 Considere duas listas encadeadas circulares, no vazias. Os


ponteiros para o primeiro elemento de cada lista so PtLista1 e PtLista2,
respectivamente. Analise o seguinte trecho de cdigo:

Apt PtLista1.Prox
PtLista1.Prox PtLista2.Prox
PtLista2.Prox Apt
PtLista1 PtLista2
PtLista2 nulo

Qual o resultado da execuo deste trecho de cdigo?


Qual o resultado da execuo deste trecho de cdigo caso PtLlista1 e
PtLista2 apontassem para dois elementos distintos da mesma lista cir-
cular?

exerccio 22 Implemente uma funo que receba como parmetro o ende-


reo de acesso a uma lista encadeada circular e um nmero inteiro N e retorne
o nmero de nodos da lista que possuem um campo de informao com
valores maiores do que o valor N.

exerccio 23 Implemente um algoritmo que receba como parmetro um


ponteiro para um elemento de uma lista circular encadeada e um valor e re-
torne a lista resultante da remoo de todos os nodos que apresentarem em
seu contedo o valor passado como parmetro.
Captulo 3 Listas Lineares 121

exerccios com listas lineares duplamente encadeadas


exerccio 24 Implemente uma funo que receba, como parmetro, o pon-
teiro para uma lista simplesmente encadeada e retorne o ponteiro para uma
lista duplamente encadeada, resultante da cpia dos valores da lista simples-
mente encadeada.

exerccio 25 Construa um algoritmo que receba como parmetros uma lista


duplamente encadeada e dois valores (original e novo). O algoritmo deve
percorrer a lista comparando os campos de informao dos nodos e trocando
todas as ocorrncias do valor original pelo valor novo.

exerccio 26 Implemente um algoritmo que calcule o maior elemento, o


menor elemento e a mdia aritmtica dos elementos de uma lista duplamen-
te encadeada, com descritor.

exerccio 27 Implemente a operao que insere um novo nodo em qualquer


posio de uma lista duplamente encadeada circular.

exerccio 28 Implemente um algoritmo que retorne o valor associado a um


determinado nodo de uma lista duplamente encadeada circular. O nodo a ser
consultado deve ser identificado por sua ordem, e deve ser acessado de forma
otimizada, ou seja, no sentido mais prximo da posio em que se encontra.

exerccios de aplicaes
exerccio 29 Uma maneira usual de representar conjuntos listando seus
elementos. Implemente uma aplicao que oferea as operaes usuais de
conjuntos (unio, interseco e diferena), considerando que cada um dos
conjuntos representado por uma lista encadeada.

exerccio 30 A lenda conta que Josephus no teria sobrevivido para tor-


nar-se famoso se no fosse o seu talento matemtico. Durante a guerra
entre judeus e romanos, ele estava entre um bando de 41 judeus rebel-
des encurralados pelos romanos em uma caverna. No havia esperana de
vencer os inimigos sem reforos e existia um nico cavalo para escapar. Os
rebeldes fizeram um pacto para determinar qual deles escaparia em busca
122 Estruturas de Dados

de ajuda. Eles formaram um crculo e, comeando a partir de um deles,


comearam a contar no sentido horrio em torno do crculo. Quando a
contagem alcanava o nmero 3, aquele rebelde era removido do crculo
e a contagem recomeava a partir do prximo soldado, at que o ltimo
soldado restasse no crculo. Este seria o soldado que tomaria o cavalo e
fugiria em busca de ajuda. Mas Josephus, com medo da morte iminente,
calculou rapidamente onde ele deveria estar neste crculo para que pudesse
ser ele o ltimo soldado restante no crculo. Implemente uma aplicao
para solucionar o problema de Josephus: dado um nmero de soldados N
e um nmero D N, que estabelece o nmero fixo de remoo de elementos,
determine a ordem em que os soldados so eliminados do crculo e qual deles
escapar.

exerccio 31 Suponha que uma fbrica de potes plsticos com tampas co-
loridas (vermelha-V, verde-G, azul-B). O funcionrio da linha de montagem
monta 100 potes por dia. No incio da jornada ele recebe uma ordem de
montagem, onde consta o nmero de potes a montar de cada cor. Outro
funcionrio monta kits com potes de trs cores diferentes. Especifique as es-
truturas de dados para os tipos de pote e kit. Implemente uma aplicao que
represente o processo de montagem dos kits.

exerccio 32 Uma frase pode ser representada por uma lista linear enca-
deada, sendo que o campo de informao de cada nodo da lista contm
um nico caractere ou smbolo. Implemente uma aplicao para realizar as
operaes descritas a seguir, considerando uma lista que inicia no endereo
PtFrase:

converta a lista encadeada em uma lista armazenada sobre um arranjo


FRASE, cujos elementos so caracteres;
implemente uma funo que recebe como parmetro dois caracteres, I1 e
I2, e retorne o ponteiro para uma nova lista, representando a palavra que
inicia com o caractere I1 e termina com o caractere I2.
Captulo 3 Listas Lineares 123

exerccio 33 Considerando duas listas, cada uma armazenando uma frase


na forma descrita no exerccio anterior, acessadas pelos ponteiros PtFrase1 e
PtFrase2, implemente os seguintes algoritmos:

uma funo que recebe como parmetro o ponteiro para as duas frases
e devolve um inteiro indicando a posio de incio da primeira ocorrncia
da segunda frase dentro da primeira frase. Se a segunda frase no estiver
contida na primeira, ento deve ser devolvido o valor 1;
um procedimento que recebe como parmetro dois inteiros, I1 e I2, e
substitua os elementos da lista apontada por PtL2 por I2 elementos da
lista apontada por PtL1, comeando da posio I1. A lista apontada por
PtL1 no deve ser modificada;
uma funo que devolva 1 se a frase apontada por PtL1 for menor do
que a frase apontada por PtL2, 0 se forem do mesmo tamanho e 1 se a
frase apontada por PtL1 for maior.

exerccio 34 Os dados de um grupo de atletas foram organizados em uma


lista linear simplesmente encadeada. O campo de informao de cada ele-
mento da lista apresenta o nome e a altura de um atleta. O endereo do pri-
meiro elemento da lista est em um descritor, cujo endereo est na varivel-
ponteiro ATLETAS. A lista est organizada em ordem alfabtica de atletas.
Implemente uma aplicao para:

gerar uma segunda lista, duplamente encadeada, cujo endereo est na


varivel-ponteiro ALTURAS. Nesta segunda lista devero estar as mesmas
informaes da primeira lista, porm organizadas por ordem decrescente
de alturas;
excluir das duas listas o nodo correspondente a um determinado atleta
(nome passado como parmetro).
captulo
???????? 4
pilhas
???????
e filas

Determinadas listas
lineares
?????????????????????????
apresentam alguma
??????????????????
disciplina restrita de organizao e de acesso a seus nodos,
que deve ser obedecida por todas as operaes realizadas sobre
os nodos destas listas. So listas especiais nas quais no so
permitidas operaes sobre quaisquer nodos, mas somente
sobre aqueles definidos pela organizao da lista.
126 Estruturas de Dados

As duas principais restries apresentadas para listas so:

LIFO (Last In First Out) dentre os nodos da lista, o primeiro nodo a


ser retirado deve ser o ltimo nodo que foi inserido;
FIFO (First In First Out) primeiro nodo a ser retirado deve ser o pri-
meiro que foi inserido.

As listas que respeitam a restrio LIFO so denominadas Pilhas; j aque-


las que obedecem a restrio FIFO, so denominadas Filas. Essas estrutu-
ras de dados, embora simples, se sobressaem devido grande utilidade que
apresentam, modelando diversas aplicaes prticas, tanto em computao
quanto em outros domnios. O critrio LIFO, por exemplo, corresponde a
uma pilha de pratos, onde um novo prato sempre colocado no topo da
pilha, devendo o primeiro prato a ser retirado ser o do topo da pilha. Um
exemplo do critrio FIFO o funcionamento de uma fila de banco, onde as
pessoas so atendidas na ordem que entram na fila: o primeiro a chegar ser
o primeiro a ser atendido. Pilhas e Filas esto, portanto, entre as estru-
turas de dados que so freqentemente implementadas e fazem parte de
um vasto conjunto de aplicaes que tambm incluem outras estruturas de
dados mais sofisticadas.

Neste captulo so discutidos os algoritmos que lidam com pilhas, filas e


filas duplas. Para cada uma destas estruturas so vistas inicialmente as
operaes bsicas considerando a implementao por contigidade fsica
e, em seguida, as mesmas operaes considerando implementao por
encadeamento.

4.1 pilhas
Pilhas so listas nas quais o acesso somente pode ser feito em uma das extre-
midades, denominada de topo da pilha. Todas as consultas, alteraes, in-
cluses e remoes de nodos somente podem ser realizadas sobre um nodo,
que aquele que est na extremidade considerada o topo da pilha. Esta disci-
plina de acesso tambm conhecida como LIFO Last In First Out o
primeiro nodo a ser retirado deve ser o ltimo nodo que foi includo na pilha
(Figura 4.1).
Captulo 4 Pilhas e Filas 127

Pilhas so estruturas de dados fundamentais, sendo usadas em muitas


aplicaes em computao. Por exemplo, editores de texto oferecem um
mecanismo de reverso de operaes (undo) que cancela operaes
recentes e reverte um documento ao estado anterior operao. Esse
mecanismo implementado mantendo as alteraes do texto em uma
pilha. Navegadores para Internet tambm armazenam os endereos mais
recentemente visitados em uma estrutura de dados do tipo pilha. Cada
vez que o navegador visita um novo site, o endereo armazenado na
pilha de endereos. Usando a operao de retorno (back), o navegador
permite que o usurio retorne ao ltimo site visitado, retirando o seu en-
dereo da pilha.

As operaes que podem ser realizadas sobre uma pilha so limitadas pela
disciplina de acesso que apresentam. Assim, somente as seguintes operaes
podem ser executadas:

criar a pilha vazia;


inserir um novo nodo no topo da pilha (operao comumente denomina-
da PUSH);
excluir o nodo do topo da pilha (operao comumente denominada POP);
consultar e/ou modificar o nodo que est no topo da pilha;
destruir a pilha, liberando as posies reservadas para ela.

Excluses Inseres
Consultas

Topo

Base

Figura 4.1 Pilha.


128 Estruturas de Dados

Estas operaes so analisadas a seguir, considerando as duas possveis for-


mas de representao fsica por contigidade fsica e por encadeamento.

4.1.1 pilhas implementadas por contigidade fsica


Para manipular uma pilha implementada sobre um arranjo necessrio que
se conhea trs valores:

o ndice do arranjo a partir do qual a pilha pode ser implementada, geral-


mente denominado de Base da pilha;
o ndice ocupado pelo elemento que est no Topo da pilha, e que o ni-
co elemento que pode ser manipulado; e
o ndice do ltimo elemento do arranjo que poder ser utilizado por esta
pilha, aqui denominado de Lim (limite da pilha).

Como exemplo de manipulao desta estrutura de dados, consideremos uma


pilha implementada sobre um arranjo denominado PILHA, a partir do ndice
1, com espao para armazenar no mximo 6 nodos. Nessa pilha so arma-
zenados valores inteiros. A seguinte seqncia de operaes apresentada
graficamente na Figura 4.2:

1 inicializar a pilha no exemplo, isto indicado por Topo valendo 0 (figura


4.2a);
2 inserir um novo nodo com valor 3 (figura 4.2b);

LIM LIM LIM LIM LIM


6 6 6 6 6

5 5 5 5 5

4 4 4 4 4

TOPO
3 3 3 3 5 3

TOPO TOPO
2 2 2 7 2 7 2 7
TOPO
BASE BASE BASE BASE BASE
1 1 3 1 3 1 3 1 3
TOPO = 0
PILHA PILHA PILHA PILHA PILHA
(a) (b) (c) (d) (e)

Figura 4.2 Exemplo de manipulao de uma pilha.


Captulo 4 Pilhas e Filas 129

3 inserir um novo nodo com valor 7 (figura 4.2c);


4 inserir um novo nodo com valor 5 (figura 4.2d);
5 remover um nodo (figura 4.2e).

Aps a execuo destas operaes, caso a pilha fosse consultada, o valor


retornado seria 7, uma vez que este o valor do nodo que est no topo da
pilha.

A seguir so apresentados os algoritmos relativos s operaes bsicas sobre


uma pilha, considerando este tipo de implementao. Ser utilizado o seguin-
te tipo de dado:

TipoPilha = arranjo [1.. N] de TipoNodo

A operao de destruio da pilha no ser apresentada, uma vez que en-


volve somente o espao reservado para a pilha no arranjo, o que deve ser
controlado diretamente pela aplicao.

criao da pilha
A criao de uma pilha resultar em uma pilha vazia, devolvendo ao usurio as
informaes necessrias para seu posterior acesso. Dever ser utilizada alguma
conveno para indicar que a pilha est vazia. Optamos pela seguinte estra-
tgia: a indicao de que a pilha est vazia feita quando o ndice de topo
da pilha estiver indicando uma unidade a menos do que o ndice de sua base.
Os algoritmos que manipulam a pilha (insero, remoo e consulta) utilizam
esta estratgia para reconhecer a pilha vazia. Caso outra forma de representa-
o da pilha vazia seja utilizada, os algoritmos devero ser a ela adaptados.

Assim, considerando a pilha implementada sobre o arranjo Pilha da Figura


4.2, as variveis de controle da pilha so inicializadas em:

Base 1
Topo Base 1
Lim 6

A aplicao deve conhecer os limites do arranjo reservados para a pilha (Base


e Lim). Um algoritmo que inicializa uma pilha atravs da estratgia acima
citada deve receber, da aplicao, o ndice da base da pilha, inicializando o
Topo com uma unidade a menos, como apresentado a seguir.
130 Estruturas de Dados

Algoritmo 4.1 InicializarPilhaArr


Entrada: Base (inteiro)
Sada: Topo (inteiro)
incio
Topo Base 1
fim

insero de um nodo na pilha


Um novo nodo s pode ser inserido no topo da pilha, ou seja, logo acima
da posio ocupada pelo topo da pilha. Esta operao tambm conhecida
como operao PUSH. Para que isso seja possvel, necessrio que haja espao
para este novo nodo no espao reservado para a pilha sobre o arranjo, o que
informado pelo valor do limite da pilha, Lim. Caso a insero seja realizada,
o valor do topo da pilha incrementado, sendo este agora o nodo do topo e,
conseqentemente, o nico ao qual se tem acesso.

O algoritmo apresentado a seguir insere um novo nodo no topo da pilha.


Inicia verificando se h espao no arranjo para a insero e, em caso de haver
espao, passa o Topo para a prxima posio do arranjo, inserindo o valor
recebido (Valor) nesta posio. O parmetro Sucesso retorna falso no caso
de no haver mais espao para inserir um novo nodo.

Algoritmo 4.2 InserirPilhaArr


Entradas: Pilha (TipoPilha)
Lim (inteiro)
Topo (inteiro)
Valor (TipoNodo)
Sadas: Pilha (TipoPilha)
Topo (inteiro)
Sucesso (lgico)
incio
se Topo < Lim
ento incio
Topo Topo + 1
Pilha[Topo] Valor
Sucesso verdadeiro
fim
seno Sucesso falso
fim
Captulo 4 Pilhas e Filas 131

remoo de um nodo da pilha


Somente o nodo do topo de uma pilha pode ser removido. Esta operao,
denominada simplesmente de remoo da pilha, tambm conhecida por
operao POP. A operao pode ser realizada se a pilha apresentar pelo menos
um nodo, diminuindo o valor do ndice do seu topo.

No algoritmo apresentado a seguir removido o nodo do topo da pilha. Se a


pilha estiver vazia no incio da operao, Sucesso retorna falso. Como muitas
vezes o nodo removido utilizado pela aplicao, este algoritmo tambm
retorna o valor do nodo que foi removido no parmetro ValorRemovido.

Algoritmo 4.3 RemoverPilhaArr


Entradas: Pilha (TipoPilha)
Topo (inteiro)
Base (inteiro)
Sadas: Pilha (TipoPilha)
Topo (inteiro)
Sucesso (lgico)
ValorRemovido (TipoNodo)
incio
se Topo Base
ento incio
ValorRemovido Pilha[Topo]
Topo Topo 1
Sucesso verdadeiro
fim
seno Sucesso falso
fim

acesso pilha
Consultas e/ou alteraes somente podem ser realizadas sobre o nodo que
est no topo da pilha. Para acessar algum outro nodo da pilha necessrio
antes remover os nodos que esto acima dele, a partir dos que esto no topo
da pilha.

A seguir apresentado um algoritmo que consulta o nodo do topo da pilha,


devolvendo seu valor atravs do parmetro Valor. Caso a pilha esteja vazia,
o parmetro Sucesso retorna falso, informando que a operao no pode
132 Estruturas de Dados

ser realizada. Como esta operao somente consulta o nodo do topo da pilha
sem remov-lo, no so alterados os valores do arranjo que implementa a
pilha, nem suas variveis de controle (Base, Topo e Lim).

Algoritmo 4.4 ConsultarPilhaArr


Entradas: Pilha (TipoPilha)
Base (inteiro)
Topo (inteiro)
Sadas: Valor (TipoNodo)
Sucesso(lgico)
incio
se Topo Base
ento incio
Valor Pilha[Topo]
Sucesso verdadeiro
fim
seno Sucesso falso
fim

4.1.2 pilhas implementadas por encadeamento


Pilhas tambm podem ser implementadas encadeando seus nodos, atravs
da utilizao de ponteiros. Nesse caso, cada nodo da pilha ter pelo menos
dois campos: um campo onde so armazenadas as informaes relativas a
este nodo, aqui denominado de Info, e um campo que serve para encadear
os nodos da pilha, que denominamos de Elo. Assim, o tipo definido para os
nodos da pilha encadeada ser o seguinte:

TipoNodo = registro
Info: TipoInfo
Elo: TipoPtNodo
fim registro

A Figura 4.3 mostra uma pilha implementada por encadeamento. O en-


dereo do topo da pilha (PtPilha) deve ser conhecido, sendo este o nico
nodo acessado devido disciplina imposta por esta estrutura de dados. A
base da pilha ser o ltimo nodo, apresentando no campo Elo um endereo
nulo.

A seguir so apresentados algoritmos para as operaes bsicas sobre pilhas,


quando implementadas por encadeamento.
Captulo 4 Pilhas e Filas 133

PtPilha

Topo da pilha

Base da pilha

Figura 4.3 Pilha implementada por encadeamento.

criao de pilha encadeada


A criao de uma pilha encadeada feita atribuindo um endereo nulo
varivel-ponteiro que guardar o endereo do topo da pilha, de acordo com
a conveno utilizada neste texto para representar uma pilha vazia.

O algoritmo para criao da pilha, apresentado a seguir, simplesmente coloca


o endereo nulo na varivel que ir apontar para o topo da pilha (PtPilha).

Algoritmo 4.5 CriarPilhaEnc


Entradas: -
Sada: PtPilha (TipoPtNodo)
incio
PtPilha nulo
fim

insero de um nodo em pilha encadeada


Como a insero feita sempre no topo da pilha, o novo nodo deve ser enca-
deado com aquele que estava no topo da pilha, passando a ser o novo topo
da pilha encadeada. Essa operao equivalente operao de insero no
incio de uma lista simplesmente encadeada (Algoritmo 3.20).

O algoritmo a seguir realiza as seguintes operaes: (1) aloca o novo nodo,


preenchendo-o com o Valor recebido para seu campo de informao; (2) en-
134 Estruturas de Dados

cadeia este novo nodo com aquele que estava no topo da pilha no momento
de ser executada esta operao; e (3) direciona a varivel que apontava para o
topo da pilha para este novo nodo, que agora passa a ser o seu topo. feita a
suposio de que a alocao de novos nodos sempre possa ser realizada.

Algoritmo 4.6 InserirPilhaEnc


Entradas: PtPilha (TipoPtNodo)
Valor (TipoInfo)
Sada: PtPilha (TipoPtNodo)
Varivel local: PtNovo (TipoPtNodo)
incio
alocar(PtNovo)
PtNovo.Info Valor
PtNovo.Elo PtPilha
PtPilha PtNovo
fim

remoo de um nodo em pilha encadeada


A remoo do nodo do topo da pilha executada fazendo a varivel-ponteiro
que indicava o topo da pilha apontar para o nodo que estava na segunda po-
sio na pilha, liberando em seguida o espao que estava sendo ocupado pelo
nodo que foi removido. Essa operao equivalente operao de remoo
do primeiro nodo de uma lista encadeada (Algoritmo 3.23, com K=1).

O algoritmo a seguir implementa esta operao, retornando Sucesso verda-


deiro caso a pilha no esteja inicialmente vazia, ou seja, caso exista um nodo
no topo da pilha para ser removido. Caso seja removido o ltimo nodo da
pilha, o ponteiro de acesso passar a ter o endereo nulo.

Algoritmo 4.7 RemoverPilhaEnc


Entrada: PtPilha (TipoPtNodo)
Sadas: PtPilha (TipoPtNodo)
Sucesso (lgico)
Varivel local: PtAux (TipoPtNodo)
incio
se PtPilha nulo
ento incio
PtAux PtPilha
PtPilha PtPilha.Elo
liberar(PtAux)
Captulo 4 Pilhas e Filas 135

Sucesso verdadeiro
fim
seno Sucesso falso
fim

acesso pilha encadeada


O acesso ao nodo que est no topo da pilha fica muito simples quando esta
implementada atravs de encadeamento, pois a varivel-ponteiro de acesso
pilha j contm o endereo do seu topo, nico nodo da pilha que pode ser
acessado para consulta ou alterao. O algoritmo a seguir executa uma con-
sulta pilha, devolvendo o valor contido no campo de informao do nodo
que est no topo atravs do parmetro Valor. O parmetro lgico Sucesso
indica se a operao foi executada adequadamente, ou seja, retorna falso
caso a pilha no tenha algum nodo para ser consultado.

Algoritmo 4.8 ConsultarPilhaEnc


Entrada: PtPilha (TipoPtNodo)
Sadas: Valor (TipoInfo)
Sucesso (lgico)
incio
se PtPilha = nulo
ento Sucesso falso
seno incio
Sucesso verdadeiro
Valor PtPilha.Info
fim
fim

Uma operao que combina consulta e remoo muito utilizada em


aplicaes que utilizam pilhas para armazenar valores que posteriormen-
te sero utilizados, na ordem inversa da qual foram armazenados. Isto
facilmente obtido empilhando estes valores (inserindo-os na pilha), para
depois desempilh-los. A segunda parte (desempilhar) combina as ope-
raes de consulta (fornece o valor que est no topo da pilha para que
seja utilizada pela aplicao) e de remoo do topo (pois este no mais
necessrio).

O algoritmo a seguir implementa esta operao. O valor do nodo que estava


no topo da pilha devolvido atravs do parmetro Valor, sendo em seguida
136 Estruturas de Dados

este nodo liberado. O ponteiro para o topo passa a apontar para o nodo se-
guinte. Caso o nodo desempilhado seja o ltimo da pilha, o ponteiro da pilha
passar a conter o endereo nulo.

Algoritmo 4.9 Desempilhar


Entrada: PtPilha (TipoPtNodo)
Sadas: PtPilha (TipoPtNodo)
Valor (TipoInfo)
Sucesso (lgico)
Varivel local: PtAux (TipoPtNodo)
incio
se PtPilha = nulo
ento Sucesso falso
seno incio
Sucesso verdadeiro
Valor PtPilha.Info
PtAux PtPilha
PtPilha PtPilha.Elo
liberar(PtAux)
fim
fim

destruio de uma pilha encadeada


Quando uma pilha no mais necessria aplicao, interessante que as
posies ocupadas por ela sejam liberadas. Isto feito percorrendo a pilha, a
partir de seu topo, liberando cada uma das posies acessadas. No final da
operao, o endereo do topo da pilha ser nulo. O algoritmo a seguir im-
plementa esta operao, que equivalente operao de destruio de uma
lista encadeada (Algoritmo 3.25).

Algoritmo 4.10 DestruirPilhaEnc


Entrada: PtPilha (TipoPtNodo)
Sada: PtPilha (TipoPtNodo)
Varivel local: PtAux (TipoPtNodo)
incio
enquanto PtPilha nulo
faa incio
PtAux PtPilha
PtPilha PtPilha.Elo
liberar(PtAux)
fim
fim
Captulo 4 Pilhas e Filas 137

4.2 filas
Filas so listas nas quais somente podem ser acessados os dois nodos que es-
to nas duas extremidades da lista. As incluses de novos nodos so sempre
efetuadas no final da lista, e as operaes de consulta, alterao de informa-
es e de remoo, no seu incio. Esta disciplina de acesso recebe o nome de
FIFO First In First Out primeiro nodo a ser retirado deve ser o primei-
ro que foi includo (Figura 4.4).

Existem vrias aplicaes na rea de computao para as estruturas de dados


do tipo fila. Por exemplo, a estrutura apropriada para o gerenciamento de
impresses em sistemas multiusurios, onde somente uma requisio pode
ser atendida de cada vez, uma fila, na qual as primeiras requisies para
impresso so tambm as primeiras a serem executadas.

As operaes que podem ser realizadas sobre uma fila so:

criar a fila vazia;


inserir um novo nodo no final da fila;
excluir o nodo que est no incio da fila;
consultar e/ou modificar o nodo que est no incio da fila;
destruir a fila, ou seja, liberar o espao que estava reservado para a fila.

A seguir so analisadas estas operaes considerando novamente as duas


possveis formas de representao fsica por contigidade fsica e por enca-
deamento.

4.2.1 filas implementadas por contigidade fsica


A disciplina de fila impe que todas as inseres de novos nodos sejam feitas
no final da fila, e que todas as retiradas ocorram no incio. Como na imple-
mentao de uma fila sobre um arranjo todos os nodos poderiam ser aces-
sados a qualquer momento, necessrio que sejam conhecidos os ndices

Excluses
e Incio Final
Consultas Inseres

Figura 4.4 Fila.


138 Estruturas de Dados

que identificam as extremidades da fila, de modo que as operaes sejam


realizadas somente nestes elementos. Neste texto so utilizados os seguintes
nomes para estes ndices:

LI e LS ndices que delimitam o incio e o final do espao reservado no


arranjo para a fila;
IF incio da fila, ou seja, ndice do primeiro nodo da fila, de onde so
retirados os nodos e no qual so feitas as operaes de consulta e de
alterao;
FF fim da fila, ou seja, ndice do ltimo nodo da fila, atrs do qual so
inseridos os novos nodos.

Como exemplo de manipulao desta estrutura de dados, consideremos uma


fila implementada sobre um arranjo denominado FILA, a partir do ndice 1,
com espao para armazenar no mximo 6 nodos. Nesta fila so armazenados
valores inteiros. A seguinte seqncia de operaes apresentada grafica-
mente na Figura 4.5:

1 inicializar a fila, aqui representado pelo valor zero para o ndice de incio
da fila (IF) (Figura 4.5a);

IF=0 LI LS
1 2 3 4 5 6

(a) FILA

IF=0 LI=IF=FF LS
1 2 3 4 5 6

(b) FILA 3

IF=0 LI=IF FF LS
1 2 3 4 5 6

(c) FILA 3 7

IF=0 LI=IF FF LS
1 2 3 4 5 6

(d) FILA 3 7 5

IF=0 LI IF FF LS
1 2 3 4 5 6

(e) FILA 7 5

Figura 4.5 Exemplo de manipulao de uma fila.


Captulo 4 Pilhas e Filas 139

2 inserir um novo nodo com valor 3 (Figura 4.5b);


3 inserir um novo nodo com valor 7 (Figura 4.5c);
4 inserir um novo nodo com valor 5 (Figura 4.5d);
5 remover um nodo (Figura 4.5e).

Caso seja realizada uma consulta a esta fila aps estas operaes, o valor re-
tornado ser 7, que o valor contido no nodo que est no incio da fila.

Neste exemplo pode-se observar que a rea disponvel para a fila vai sendo
preenchida, avanando o incio da fila ao longo do arranjo medida que
os nodos vo sendo removidos da fila. Chegar um momento em que no
ser mais possvel inserir novos nodos no final da fila, por falta de espao na
rea disponvel para o arranjo. Entretanto, no incio desta rea provavelmente
restaro posies que poderiam ser ocupadas pelos novos nodos. Por isso,
sugere-se que na implementao de filas sobre arranjos seja utilizada a es-
tratgia de listas circulares quando no existir mais espao no final da rea
disponvel no arranjo para inserir o novo nodo, utilizado o espao que so-
brou no incio, conforme apresentado na Seo 3.3. Na Figura 4.6 ilustrada
a situao em que uma fila de quatro nodos inicia no elemento de ndice 4 e
termina na primeira posio do arranjo.

Embora a forma mais indicada para implementar filas sobre arranjos seja fa-
zendo a ocupao circular da rea disponvel, alternativamente poderia ser
feito o rearranjo deste espao, conforme mostrado no captulo 3.

A seguir so apresentados algoritmos que implementam as operaes bsi-


cas que podem ser executadas sobre uma fila. Ser utilizado o seguinte tipo
de dado:

TipoFila = arranjo[1.. N] de TipoNodo

O arranjo no qual a fila implementada denominado neste texto de Fila,


sendo utilizada a estratgia de ocupao circular do espao disponvel para a
fila em todas as operaes. A alocao de espao sobre o arranjo que pode

LI=FF IF LS
1 2 3 4 5 6

FILA 4 9 2 3

Figura 4.6 Ocupao circular do arranjo pela fila.


140 Estruturas de Dados

ser ocupado pela fila fica a cargo da aplicao, que deve informar os ndices
de incio e de final desta rea (LI e LS).

criao de uma fila


Uma vez alocada a rea destinada para a fila, a operao de criao desta fila
inicializa as variveis de incio e de final da fila. Deve ser definida uma estra-
tgia para reconhecer quando a fila estiver vazia. Neste texto adota-se que a
fila vazia representada pelos valores dos ndices de incio e de final imediata-
mente anteriores ao primeiro do espao disponvel para a fila.

A seguir apresentado um algoritmo para realizar a operao de inicializar


(criar) uma fila. O ndice do incio da rea disponvel para a fila (LI) recebido
como parmetro. Ao final de sua execuo, os indicadores de incio e final
da fila (IF e FF) so devolvidos inicializados, usando como conveno que
o incio e o final da fila, uma unidade a menos do que o ndice da primeira
posio que pode ser ocupada pela fila no arranjo.

Algoritmo 4.11 InicializarFilaArr


Entrada: LI (inteiro)
Sadas: IF, FF (inteiros)
incio
IF FF LI 1
fim

insero de um nodo em uma fila


Novos nodos so inseridos sempre no final da fila. Para realizar a insero
necessrio verificar se existe espao disponvel para o novo nodo. Trs situa-
es podem ser identificadas:

existe espao atrs do ltimo nodo, estando o ndice de incio da fila antes
do de final da fila, isto , FF < LS e IF < FF;
a fila ocupa o espao at o final, mas h espao livre no incio da rea
disponvel, isto , FF = LS e LI < IF; e
a fila ocupa o espao at o final e continua no incio do arranjo, restando
espao livre no meio, isto , FF < IF 1.

Uma vez verificada a existncia de espao para a insero, o novo nodo pode
ser inserido. O ndice de final da fila atualizado e o valor para o campo de
Captulo 4 Pilhas e Filas 141

informao, passado como parmetro, inserido na posio correspondente.


O algoritmo apresentado a seguir implementa esta operao, retornando Su-
cesso falso caso no exista espao para a insero do novo nodo.

Algoritmo 4.12 InserirFilaArr


Entradas: Fila (TipoFila)
LI, LS, IF, FF (inteiros)
Info (TipoNodo)
Sadas: IF, FF (inteiros)
Sucesso (lgico)
incio
se (FF IF 1) e ((IF LI) ou (FF LS))
ento incio
se IF = LI 1
ento IF FF LI {INSERO DO PRIMEIRO NODO}
seno se FF = L
ento FF LI {INSERO NO INCIO}
seno FF FF + 1 {INSERO NO MEIO OU ATRS}
FILA[FF] Info
Sucesso verdadeiro
fim
seno Sucesso falso
fim

remoo de um nodo de uma fila


Somente o nodo que est no incio da fila pode ser removido (excludo da
fila) devido disciplina imposta para esta estrutura de dados. Para efetuar
a remoo do nodo necessrio somente avanar o ndice do incio da fila
para o prximo nodo, que passar a ser o primeiro. Deve-se tomar cuidado
ao avanar este ndice quando estiver sendo adotada a utilizao circular do
espao do arranjo destinado fila.

A seguir apresentado um algoritmo que realiza esta operao. O parmetro


lgico Sucesso retorna falso caso a fila esteja vazia. Se existir algum nodo
na fila, o ndice de incio da fila (IF) avana para o prximo nodo. Se o nodo
removido estiver na ltima posio da rea disponvel (IF = LS), o prximo
nodo estar no incio da rea disponvel (em LI). Caso o nodo removido seja
o nico da fila (IF = FF), os ndices de incio e de final da fila so colocados
no valor padronizado para fila vazia (aqui adotado como uma unidade infe-
rior ao ndice de incio da rea disponvel). Somente o valor do ndice de incio
da fila atualizado nenhuma alterao feita no arranjo.
142 Estruturas de Dados

Algoritmo 4.13 RemoverFilaArr


Entradas: LI, LS, IF, FF (inteiros)
Sadas: IF, FF (inteiros)
Sucesso (lgico)
incio
se IF LI 1
ento incio
se IF = FF
ento IF FF LI 1 {FILA FICA VAZIA}
seno se IF = LS
ento IF LI
seno IF IF + 1
Sucesso verdadeiro
fim
seno Sucesso falso
fim

acesso a uma fila


Somente o nodo que est no incio da fila pode ser acessado, tanto para con-
sulta como para alterao. O algoritmo a seguir realiza uma consulta a uma
fila, retornando o valor contido no campo de informao do nodo que est
no incio da fila atravs do parmetro Info. Caso a fila esteja vazia, o parme-
tro Sucesso retorna falso.

Algoritmo 4.14 ConsultarFilaArr


Entradas: Fila (TipoFila)
LI, IF (inteiros)
Sadas: Info (TipoNodo)
Sucesso (lgico)
incio
se IF LI 1
ento incio
Info Fila[IF]
Sucesso verdadeiro
fim
seno Sucesso falso
fim
Captulo 4 Pilhas e Filas 143

4.2.2 filas implementadas por encadeamento


Quando uma fila implementada atravs de encadeamento, cada nodo de-
ver ter pelo menos um campo de informao (aqui denominado Info) e um
campo de elo que o encadeia com o prximo nodo da fila (aqui denominado
Elo). Os tipo aqui definido para os nodos da pilha encadeada ser portanto
o seguinte:

TipoNodo = registro
Info: TipoInfo
Elo: TipoPtNodo
fim registro

Devido disciplina das filas, no adequado conhecer somente o endereo


do primeiro nodo da fila, pois como novos nodos sempre devem ser inseridos
no final, ser necessrio percorrer toda a fila a cada insero de um nodo. A
forma mais adequada de implementar filas por encadeamento utilizando
um descritor para acessar a fila, no qual so armazenados os endereos do
primeiro nodo (para operaes de remoo e consulta) e do ltimo nodo
(para operaes de insero). Nos algoritmos mostrados a seguir utilizada
esta estratgia, sendo usado um descritor com dois campos (Figura 4.7):

Prim campo que contm o endereo do primeiro nodo da fila; e


Ult que contm o endereo do ltimo nodo.

Os tipos de dados correspondentes a este descritor e do ponteiro para este


descritor so os seguintes:

TipoDFila = registro
Prim: TipoPtNodo

PtDF

Prim Ult

L1 L2 L3 L4

Figura 4.7 Descritor para uma fila.


144 Estruturas de Dados

Ult: TipoPtNodo
fim registro
TipoPtDFila = TipoDFila

criao da fila encadeada


A criao de uma fila encadeada, endereada por um descritor, consiste na
alocao deste descritor, inicializando os endereos do primeiro e do ltimo
nodo em um endereo nulo. O algoritmo a seguir executa esta operao,
retornando o endereo do descritor alocado.

Algoritmo 4.15 CriarFilaEnc


Entradas: -
Sada: PtDFila (TipoPtDFila)
incio
alocar(PtDFila)
PtDFila.Prim nulo
PtDFila.Ult nulo
fim

insero de um nodo na fila encadeada


A operao de insero de um novo nodo em uma fila encadeada requer
somente a alocao do novo nodo e o seu encadeamento com o ltimo. A
utilizao do descritor contendo diretamente o endereo do ltimo nodo da
fila torna esta operao trivial.

A seguir apresentado um algoritmo que realiza esta operao. O algoritmo


recebe, como parmetro, o endereo do descritor (PtDFila), alocado atravs
da operao anterior. O novo nodo alocado e encadeado com aquele que
era o ltimo, passando agora a ser o ltimo da fila. Caso este seja o primeiro
nodo alocado para a fila, seu endereo tambm colocado no campo de
incio da fila, no descritor.

Algoritmo 4.16 InserirFilaEnc


Entradas: PtDFila (TipoPtDFila)
Valor (TipoInfo)
Sadas: -
Varivel auxiliar: PtNovo (TipoPtNodo)
incio
alocar(PtNovo)
Captulo 4 Pilhas e Filas 145

PtNovo.Info Valor
PtNovo.Elo nulo
se PtDFila.Prim = nulo
ento PtDFila.Prim PtNovo
seno (PtDFila.Ult).Prox PtNovo
PtDFila.Ult PtNovo
fim

remoo de um nodo da fila encadeada


Somente o primeiro nodo pode ser removido de uma fila. Assim, o processo
de remoo necessita apenas do endereo do primeiro nodo da fila, que est
armazenado no descritor.

O algoritmo a seguir executa esta operao, retornando Sucesso falso caso


a lista esteja vazia, ou seja, quando no existir algum nodo a ser removido.
Caso exista algum nodo para ser removido, o campo de incio da fila di-
rigido para o segundo nodo, sendo o nodo requerido liberado. Se o nodo
removido for o nico da fila, tanto o campo de incio como o de final da fila
so atualizados para o endereo nulo.

Algoritmo 4.17 RemoverFilaEnc


Entrada: PtDFila (TipoPtDFila)
Sada: Sucesso (lgico)
Varivel auxiliar: PtAux (TipoPtNodo)
incio
se PtDFila.Prim nulo
ento incio
PtAux PtDFila.Prim
PtDFila.Prim PtAux.Elo
liberar(PtAux)
se PtDFila.Prim = nulo
ento PtDFila.Ult nulo
Sucesso verdadeiro
fim
seno Sucesso falso
fim

acesso a uma fila encadeada


Somente o primeiro nodo de uma fila encadeada pode ser acessado para
consulta ou alterao. O algoritmo a seguir devolve o valor contido no campo
146 Estruturas de Dados

de informao do primeiro nodo atravs do parmetro Valor. O parmetro


Sucesso retorna falso caso a lista esteja vazia.

Algoritmo 4.18 ConsultarFilaEnc


Entrada: PtDFila (TipoPtDFila)
Sadas: Valor (TipoInfo)
Sucesso (lgico)
incio
se PtDFila.Prim nulo
ento incio
Valor PtDFila.Prim.Info
Sucesso verdadeiro
fim
seno Sucesso falso
fim

destruio de uma fila encadeada


A destruio de uma fila encadeada feita percorrendo-a, a partir de seu
incio, liberando todas as posies ocupadas. Finalmente, o descritor tambm
liberado. O algoritmo apresentado a seguir executa esta operao. Para
caracterizar que a fila foi totalmente liberada, o endereo de seu descritor
(PtDFila) retornado com endereo nulo.

Algoritmo 4.19 DestruirFilaEnc


Entrada: PtDFila (TipoPtDFila)
Sada: PtDFila (TipoPtDFila)
Variveis auxiliares: P1, P2 (TipoPtNodo)
incio
se PtDFila.Prim nulo
ento incio
P1 PtDFila.Prim
repita
P2 P1.Elo
liberar(P1)
P1 P2
at P1 = nulo
fim
liberar(PtDFila)
PtDFila nulo
fim
Captulo 4 Pilhas e Filas 147

4.3 fila dupla deque


Uma fila dupla, tambm conhecida como deque, um tipo especial de fila,
na qual permitido o acesso a qualquer uma das duas extremidades da lista,
mas somente s extremidades (Figura 4.8). Inseres, alteraes, remoes e
consultas podem ser realizadas tanto no incio quanto no final da fila dupla.
Exemplos deste tipo de lista so:

canais de navegao martima ou fluvial;


servides com circulao nos dois sentidos.

As seguintes operaes podem ser realizadas sobre filas duplas:

criar a fila dupla vazia;


inserir um novo nodo em uma das duas extremidades;
excluir o nodo que est em uma das duas extremidades;
consultar e/ou modificar o nodo que est em uma das duas extremidades;
destruir a fila, liberando o espao que estava reservado para ela.

A seguir so analisadas estas operaes, considerando novamente as duas


possveis formas de representao fsica por contigidade fsica e por enca-
deamento. A extremidade na qual deve ser realizada uma determinada ope-
rao dever ser informada pela aplicao. Duas estratgias podem ser utili-
zadas na implementao das operaes: (1) definir uma operao diferente
para cada uma das extremidades; ou (2) construir uma operao genrica,
que se aplique s duas extremidades, passando a informao de qual a ex-
tremidade considerada atravs de um parmetro. Para ilustrar as duas formas
de definio das operaes neste texto, a primeira forma ser utilizada para
o caso de implementao atravs de contigidade fsica, e a segunda para o
caso de filas duplas encadeadas.

Inse es
re r
s
Incio Final Inse

Consultas Consultas

es Exc
lus lus
Exc es

Figura 4.8 Fila dupla (Deque).


148 Estruturas de Dados

4.3.1 filas duplas implementadas por contigidade fsica


A implementao de uma fila dupla sobre um arranjo semelhante imple-
mentao de uma fila simples, tendo como base os ndices que controlam
o incio e o final da rea do arranjo (LI e LS) a ser utilizada para a fila, e
as extremidades desta fila (IF e FF). Para otimizar a utilizao do arranjo
aconselhvel que neste caso tambm seja utilizada a estratgia de ocupao
circular do espao disponvel. Entretanto, como no se pode prever em qual
extremidade as operaes sero mais freqentes, a lista dupla deve ser im-
plementada de forma circular nos dois sentidos, tanto para a direita quanto
para a esquerda. No caso da lista simples, as incluses sendo sempre no final
da fila, a ocupao circular era feita sempre continuando a fila no incio do
arranjo.

A seguir so analisados os algoritmos que implementam as operaes bsicas


sobre uma fila dupla, com ocupao circular do espao disponvel. Ser utili-
zado o seguinte tipo de dado:

TipoDequeArr = arranjo[1.. N] de TipoNodo

Nos algoritmos apresentados a seguir, a representao da fila vazia feita


atravs de seu ndice de incio valendo uma unidade a menos do que o ndice
de incio da rea disponvel (IF = LI-1). A operao de destruio deste tipo
de fila no ser analisada, uma vez que dever ser controlada diretamente
pela aplicao.

Como citado anteriormente, as operaes de insero, remoo e consulta,


mostradas a seguir, sero especficas para cada uma das extremidades da fila
dupla, extremidade esta que deve ser definida pelo usurio.

criao de uma fila dupla


A operao de criao de uma fila dupla implementada sobre um arranjo
idntica de criao de uma fila convencional (Algoritmo 4.11), consistindo
to somente da inicializao dos indicadores de incio e de final da fila, de
acordo com a rea a ela reservada.

O algoritmo para realizar esta operao recebe, como parmetro, o ndice


do incio da rea disponvel para a fila (LI). Ao final de sua execuo, os
indicadores de incio e de final da fila (IF e FF) estaro inicializados em uma
Captulo 4 Pilhas e Filas 149

unidade a menos do que o ndice da primeira posio que pode ser ocupada
pela fila no arranjo.

Algoritmo 4.20 InicializarDequeArr


Entrada: LI (inteiro)
Sadas: IF, FF (inteiros)
incio
IF FF LI 1
fim

insero de um nodo em uma fila dupla


A aplicao dever indicar em qual das extremidades o novo nodo deve ser in-
serido. Para realizar a insero necessrio que a rea disponvel para a fila no
esteja toda ocupada. Caso haja espao para a insero do novo nodo e consi-
derando a ocupao circular do arranjo, as seguintes situaes podem ocorrer:

para insero no final da fila, o nodo ser inserido na primeira posio


logo aps o ltimo nodo ocupado. Caso esse ocupe a ltima posio dis-
ponvel no arranjo para esta fila, o novo nodo ocupar a primeira posio
desta rea disponvel. Esta operao a mesma apresentada para a fila
tradicional (Algoritmo 4.12);
para insero no incio da fila dupla, o nodo inserido na posio ime-
diatamente anterior ao nodo que est no incio da fila. Caso esse ocupe
a primeira posio disponvel no arranjo, o novo nodo ocupar a ltima
posio da rea disponvel. Esta operao semelhante quela apresenta-
da para insero de um nodo na primeira posio de uma lista (Algoritmo
3.15, para K=1).

O algoritmo apresentado a seguir implementa a operao de insero no


incio de uma fila dupla, retornando Sucesso falso caso no exista espao
disponvel para a insero. Inicialmente o algoritmo verifica se existe espao
livre para inserir o nodo, o que determinado pela posio ocupada pelos
ndices de incio e de final da fila. A insero realizada se existir espao, uti-
lizando, caso seja necessrio, a ocupao circular no arranjo. Se a fila estiver
vazia, o novo nodo inserido na primeira posio da rea disponvel, sendo
atualizados os ndices de incio e de final da fila.

Algoritmo 4.21 InserirIniDequeArr


Entrada: Deque (TipoDequeArr)
LI, LS, IF, FF (inteiros)
150 Estruturas de Dados

Info (TipoNodo)
Sadas: Deque (TipoDequeArr)
IF, FF (inteiros)
Sucesso (lgico)
incio
se ((FF = IF 1) ou ((IF = LI) e (FF = LS)))
ento Sucesso falso
seno incio
Sucesso verdadeiro
se IF = LI 1 {DEQUE VAZIA}
ento IF FF LI
seno se IF > LI
ento IF IF 1
seno IF LS
Deque[IF] Info
fim
fim

remoo de um nodo de uma fila dupla


Como na operao anterior, a extremidade da qual dever ser realizada a re-
moo deve ser especificada pela aplicao. A remoo do nodo do incio se-
melhante remoo de um nodo de uma fila simples, enquanto que a remo-
o do ltimo nodo equivale retirada de um nodo do topo de uma pilha.

Para exemplificar, a seguir apresentado um algoritmo que implementa a re-


moo do ltimo nodo de uma fila dupla implementada sobre um arranjo. So-
mente o ndice de final da fila dupla atualizado, sem alterao nos contedos
do arranjo que implementa a fila. Caso a fila resulte vazia, os ndices de incio e
de final da fila dupla so colocados em uma unidade a menos do que o ndice
de incio da rea disponvel no arranjo. O parmetro lgico Sucesso retorna
falso somente no caso de a fila estar vazia no incio da operao.

Algoritmo 4.22 RemoverFimDequeArr


Entradas: LI, LS, IF, FF (inteiros)
Sadas: IF, FF (inteiros)
Sucesso (lgico)
incio
se IF LI 1
ento incio
se IF = FF {DEQUE VAI FICAR VAZIA}
ento IF FF LI 1
seno se FF = LI
Captulo 4 Pilhas e Filas 151

ento FF LS
seno FF FF 1
Sucesso verdadeiro
fim
seno Sucesso falso
fim

acesso a uma fila dupla


J que as duas extremidades podem ser acessadas, aumentam as possibili-
dades de utilizao desta estrutura de dados. Uma aplicao poder con-
sultar especificamente uma das extremidades (especificando a priori qual
delas), ou consultar as duas extremidades simultaneamente em busca de
alguma informao.

Para ilustrar este ltimo caso, a seguir apresentado um algoritmo que devol-
ve o maior dos dois valores contidos nas extremidades da fila dupla. Supondo
que todos os valores contidos nos campos de informao so inteiros, todos
maiores do que zero, no caso de a fila estar vazia devolvido o valor nulo. No
caso de os valores dos nodos das duas extremidades serem iguais, o algorit-
mo retornar o valor sem informar a igualdade.

Algoritmo 4.23 ConsultarMaiorDequeArr


Entradas: Deque (TipoDequeArr)
LI, IF, FF (inteiros)
Sada: MaiorValor (inteiro)
incio
se IF = LI 1
ento MaiorValor 0
seno se Deque[IF] > Deque[FF]
ento MaiorValor Deque[IF]
seno MaiorValor Deque[FF]
fim

4.3.2 filas duplas encadeadas

Na implementao de filas duplas atravs de encadeamento tambm conve-


niente a utilizao de um descritor que contenha o endereo do primeiro e do
ltimo nodos, permitindo acess-los diretamente. Isto permite que o acesso
ao ltimo nodo seja otimizado para as operaes de insero, alterao e
consulta. No entanto, esta representao no facilita a operao de remoo
152 Estruturas de Dados

quando o nodo a ser removido for o ltimo, pois neste caso necessrio atua-
lizar o campo de elo do penltimo nodo. Este problema solucionado quando
se implementa este tipo de fila como uma lista duplamente encadeada.

A seguir so analisadas as operaes bsicas para listas duplas implemen-


tadas com duplo encadeamento. Os tipos utilizados para o descritor e seu
apontador so os seguintes:

TipoDDeque = registro
Prim: TipoPtNodo
Ult: TipoPtNodo
fim registo
TipoPtDDeque = TipoDDeque

O tipo do nodo o mesmo utilizado na seo 3.6, ou seja:

TipoNodo = registro
Ant: TipoPtNodo
Info: TipoInfoNodo
Prox: TipoPtNodo
fim registro

Diferentemente do apresentado para as listas duplas implementadas sobre ar-


ranjos, onde cada operao era especfica para uma das extremidades, aqui so
vistos algoritmos genricos, que implementam as operaes em qualquer uma
das duas extremidades, sendo o lado informado atravs de um parmetro.

criao de uma fila dupla encadeada


De forma semelhante mostrada para uma fila encadeada simples, a criao
de uma fila dupla encadeada endereada por um descritor consiste na aloca-
o deste descritor, inicializando os endereos do primeiro e do ltimo nodo
da fila dupla em um endereo nulo (nulo). O algoritmo a seguir executa esta
operao.

Algoritmo 4.24 CriarDequeEnc


Entradas: -
Sada: PtDDeque (TipoPtDDeque)
incio
alocar(PtDDeque)
PtDDeque.Prim PtDDdeque.Ult nulo
fim
Captulo 4 Pilhas e Filas 153

insero de um nodo em fila dupla encadeada


Como um novo nodo pode ser inserido em qualquer uma das duas extremi-
dades da fila dupla, necessrio que seja definida a posio de insero. As
inseres na frente ou no final de uma fila dupla so semelhantes insero
no incio e no final de uma lista duplamente encadeada, vistas anteriormente.

Para ilustrar a operao de insero, a seguir apresentado um algoritmo que


insere um novo nodo na fila dupla, implementada com duplo encadeamento,
sendo informado atravs de um parmetro (Lado) qual a extremidade em
que a insero deve ser realizada: para a insero no incio deve ser forneci-
do o caractere I; e para a insero no final, o caractere F. O parmetro
Sucesso retorna falso no caso de receber outro caractere. Supe-se que o
descritor da lista dupla tenha sido previamente alocado, quando da iniciali-
zao da lista. Alm de inserir o nodo na extremidade solicitada e encade-lo
apropriadamente, o campo correspondente do descritor atualizado.

Algoritmo 4.25 InserirDequeEnc


Entradas: PtDeque (TipoPtDeque)
Lado (caractere)
Valor (TipoInfoNodo)
Sada: Sucesso (lgico)
var PtNovo (TipoPtNodo)
incio
Sucesso falso
se (Lado = "I") ou (Lado = "F")
ento incio
Sucesso verdadeiro
alocar(PtNovo)
PtNovo.Info Valor
se Lado = "I"
ento incio {INSERE NO INCIO}
PtNovo.Ant nulo
se PtDDeque.Prim = nulo
ento incio
PtDDeque.Ult PtNovo
PtNovo.Prox nulo
fim
seno incio
PtNovo.Prox PtDDeque.Prim
(PtDDeque.Prim).Ant PtNovo
fim
PtDDeque.Prim PtNovo
154 Estruturas de Dados

fim
seno incio {INSERE NO FINAL}
PtNovo.Prox nulo
se PtDDeque.Prim = nulo
ento incio
PtNovo.Ant nulo
PtDDeque.Prim PtNovo
fim
seno incio
(PtDDeque.Ult).Prox PtNovo
PtNovo.Ant PtDDeque.Ult
fim
PtDDeque.Ult PtNovo
fim
fim
fim

remoo de um nodo da fila dupla encadeada


Tambm para a operao de remoo deve ser definido qual o nodo a ser remo-
vido: o primeiro ou o ltimo. A existncia do descritor permite o acesso direto a
qualquer uma das duas extremidades. Quando o ltimo nodo for removido,
necessrio atualizar o elo do penltimo nodo, que passar a ser o ltimo.

O algoritmo apresentado a seguir, a exemplo do anterior, recebe a informa-


o de qual extremidade o nodo deve ser removido atravs de um parmetro
(I quando for o primeiro, e F para o ltimo). O parmetro Sucesso retor-
na falso nas seguintes condies: se a lista estiver vazia, pois no haver nodo
a ser removido; ou quando o caractere recebido for diferente dos dois acima
citados. Caso a remoo possa ser realizada, feita a liberao da posio
ocupada pelo nodo, tornado nulo o endereo de campo prximo do nodo
que agora passa a ser o ltimo, e atualizado o descritor. Se a lista apresentar
somente um nodo, a remoo resultar na lista vazia.

Algoritmo 4.26 RemoverDequeEnc


Entradas: PtDDeque (TipoPtDDeque)
Lado (caractere)
Sada: Sucesso (lgico)
var PtAux, PtAnt (TipoPtNodo);
incio
Sucesso falso
se (PtDDeque.Prim nulo) e ((Lado = "I") ou (Lado = "F"))
Captulo 4 Pilhas e Filas 155

ento incio
Sucesso verdadeiro
se Lado = "I"
ento incio {REMOVE O PRIMEIRO}
PtAux PtDDeque.Prim
se PtDDeque.Prim = PtDDeque.Ult
ento PtDDeque.Prim PtDDeque.Ult nulo
seno incio
PtDDeque.Prim PtAux.Prox
(PtDDeque.Prim).Ant nulo
fim
fim
seno incio {REMOVE O LTIMO}
PtAux PtDDeque.Ult
se PtDDeque.Prim = PtDDeque.Ult
ento PtDDeque.Prim PtDDeque.Ult nulo
seno incio
PtDDeque.Ult PtAux.Ant
(PtDDeque.Ult).Prox nulo
fim
fim
liberar(PtAux)
fim
fim

acesso a uma das extremidades da fila dupla encadeada


Como somente as duas extremidades de uma fila dupla podem ser acessadas,
a operao de acesso imediata quando for utilizado o descritor que contm
os endereos do primeiro e do ltimo nodo. Para ilustrar, apresentamos a
seguir um algoritmo que devolve, atravs do parmetro Valor, o valor con-
tido no campo de informao de uma fila dupla, sendo informada qual a
extremidade a ser consultada. utilizada a mesma conveno das operaes
anteriores, sendo a extremidade informada atravs de um parmetro (Lado).
O parmetro Sucesso retorna falso no caso de a lista estar vazia, ou de ser
fornecido um caractere invlido (diferente de I e F) para definir a extre-
midade que deve ser consultada.

Algoritmo 4.27 ConsultarDequeEnc


Entradas: PtDDeque (TipoPtDDeque)
Lado (caractere)
Sadas: Valor (TipoInfoNodo)
156 Estruturas de Dados

Sucesso (lgico)
incio
Sucesso falso
se (PtDDeque.Prim nulo) e ((Lado = "I") ou (Lado = "F"))
ento incio
Sucesso verdadeiro
se Lado = "I"
ento Valor (PtDDeque.Prim).Info
seno Valor (PtDDeque.Ult).Info;
fim
fim

4.4 exerccios
exerccios com pilhas
exerccio 1 Em algumas aplicaes tem-se que trabalhar com mais de uma
pilha ao mesmo tempo. Pode-se implementar essas pilhas em um mesmo ar-
ranjo, de forma que cada uma ocupe parte desse arranjo. Faa um programa
que tenha duas pilhas alocadas em um mesmo arranjo, sendo que cada uma
delas cresce em sentido oposto. Implemente algoritmos para as seguintes
operaes:

inicializao das duas pilhas;


verificar se as duas pilhas esto vazias;
empilhar um elemento em cada uma das pilhas;
desempilhar um elemento de cada uma das pilhas;
imprimir o contedo do nodo no topo das duas pilhas.

exerccio 2 Faa um algoritmo que leia um conjunto de valores inteiros e


armazene estes valores em duas pilhas, uma para os valores positivos lidos e a
outra, para os valores negativos. As pilhas devem ser implementadas sobre um
mesmo arranjo PILHAS, a partir de posies fornecidas como parmetros. Em
caso de overflow de alguma das pilhas, deve ser emitida uma mensagem.

exerccio 3 Considere um arranjo unidimensional de N elementos inteiros,


utilizado para implementar duas pilhas A e B. As bases das pilhas estaro uma
em cada extremidade do arranjo. Cada uma das pilhas apresenta um ndice
prprio indicando o topo. Escreva:
Captulo 4 Pilhas e Filas 157

um algoritmo para incluir um elemento no topo da pilha B, atualizando o


indicador de topo desta pilha. Este algoritmo receber, como parmetros,
o valor do elemento a ser includo na pilha B, os ndices correspondentes
ao topo das duas pilhas e o nmero de elementos do arranjo. Dever tes-
tar se existe uma clula livre para incluir o elemento (se as duas pilhas no
esto ocupando todo o arranjo) e, caso isto ocorrer, no efetuar a incluso
e enviar uma mensagem avisando;
um algoritmo que calcule a quantidade de elementos da pilha A que tam-
bm aparecem na pilha B. Elementos repetidos na mesma pilha devem ser
contados apenas uma vez.

exerccio 4 Implemente um algoritmo que receba, como parmetro, o en-


dereo do nodo no topo de uma pilha encadeada e retorne o endereo do
topo de uma cpia dessa pilha. Ao final da execuo, a pilha deve estar no
mesmo estado em que estava no incio.

exerccio 5 Implemente um algoritmo que teste se duas pilhas so ou no


iguais. O algoritmo deve retornar o valor 1 se as duas pilhas forem iguais, e 0
caso contrrio. Ao final da execuo, as duas pilhas devem estar no mesmo
estado em que estavam no incio.

exerccios com filas


exerccio 6 No caso de duas filas serem implementadas sobre um mesmo
arranjo, cada uma com seu espao disponvel definido, implemente algorit-
mos para as seguintes operaes:

inicializar uma das duas filas;


verificar se uma das filas est vazia;
inserir um novo nodo em uma das filas;
remover um nodo de cada uma das filas;
informar o contedo do primeiro nodo de cada uma das filas.

exerccio 7 Dadas duas filas implementadas sobre dois arranjos, escreva um


algoritmo que devolva o maior dos dois elementos na frente destas filas, re-
movendo este elemento da fila correspondente. O algoritmo dever receber,
como parmetros, os ndices de incio e de final de cada uma das filas, e atu-
alizar o ndice de incio da fila da qual foi removido o elemento.
158 Estruturas de Dados

exerccio 8 Implemente um algoritmo que receba trs filas, F, F_Impares


e F_Pares, e separe todos os valores guardados em F de tal forma que os va-
lores pares so movidos para a fila F_Pares e os valores mpares so movidos
para F_Impares.

exerccio 9 Escreva um algoritmo que recebe duas filas encadeadas, sendo


que cada uma delas contm valores numricos ordenados. O algoritmo deve-
r formar uma terceira fila encadeada, tambm ordenada, na qual estaro os
valores armazenados nas filas originais.

exerccio 10 Implemente as operaes bsicas sobre filas encadeadas, con-


siderando que no utilizado um descritor para a fila, ou seja, tem-se somen-
te o endereo do primeiro nodo da fila.

exerccios com filas duplas


exerccio 11 O Algoritmo 4.21 insere um novo nodo na extremidade da
frente de uma fila dupla. Construa outro algoritmo que insira um novo nodo
na outra extremidade, ou seja, no final da fila dupla.

exerccio 12 O Algoritmo 4.22 remove o nodo que est no final de uma fila
dupla. Construa outro algoritmo que remova o nodo que est na frente desta
mesma fila dupla.

exerccio 13 Considerando uma fila dupla implementada por contigidade


fsica com ocupao circular do espao disponvel, construa algoritmos para
as seguintes operaes:

inserir um novo nodo em qualquer uma das duas extremidades da fila du-
pla. A extremidade onde deve ser realizada a insero passada como par-
metro. O algoritmo dever informar caso no haja espao para a insero;
remover um nodo de qualquer uma das extremidades, sendo esta extre-
midade passada como parmetro. O algoritmo dever ter um parmetro
lgico que indica se a remoo foi realizada com sucesso;
informar o valor contido em uma das extremidades da fila dupla. A extre-
midade considerada deve ser passada como parmetro.

exerccio 14 Adapte os algoritmos de incluso e de remoo de um novo


nodo, tanto aqueles apresentados no texto (seo 4.3.1) como os que foram
Captulo 4 Pilhas e Filas 159

construdos para o exerccio anterior, para o caso de no ser utilizada a estra-


tgia de ocupao circular do espao disponvel.

exerccio 15 Reescreva as operaes definidas para filas duplas encadeadas,


na seo 4.3.2, para o caso em que no seja utilizado um descritor para a fila.
Considere que somente o endereo do primeiro nodo da fila dupla conheci-
do, e que no existe duplo encadeamento entre os nodos.

exerccio 16 Reescreva as operaes definidas para filas duplas encadeadas,


para o caso em que no seja utilizado um descritor para a fila, mas a fila seja
duplamente encadeada. Somente o endereo do primeiro nodo da fila dever
ser conhecido.

exerccios com pilhas, filas e filas duplas


exerccio 17 Como voc implementaria uma pilha de filas? Escreva rotinas
para implementar as operaes corretas para essa estrutura de dados.

exerccio 18 Como voc implementaria uma fila de pilhas? Escreva rotinas


para implementar as operaes corretas para essa estrutura de dados.

exerccio 19 Dada uma fila onde cada nodo contm um nmero, escreva
um algoritmo que coloque os nodos desta fila em ordem crescente, usando
duas pilhas como nicas variveis auxiliares.

exerccio 20 Considere:

1 uma pilha implementada sobre um arranjo P(20) a partir da primeira


posio. O topo da pilha est armazenado na varivel TOPO; e
2 uma fila implementada sobre outro arranjo F(20), a partir da posio 1.
O incio e o final da fila esto armazenados, respectivamente, nas variveis
INICIO e FIM. utilizada a otimizao de espao do arranjo (quando a
fila chegar ao final do arranjo, se ainda existir espao disponvel no incio
do arranjo, este ser utilizado).

Escreva:

um algoritmo que retire um elemento do topo da pilha e o coloque na fila;


um algoritmo que retire um elemento da fila e o coloque na pilha.
160 Estruturas de Dados

exerccios de aplicaes
exerccio 21 Um estacionamento composto de um nico beco que guarda
no mximo 10 carros. Existe apenas uma entrada/sada no estacionamento, em
uma extremidade do beco. Se chegar um cliente para retirar um carro que no
seja o mais prximo da sada, todos os carros bloqueando seu caminho sairo
do estacionamento e os outros carros voltaro a ocupar a seqncia inicial. Es-
creva um programa que controle um grupo de carros deste estacionamento. O
programa deve imprimir uma mensagem sempre que um carro chegar ou sair.
Quando um carro chegar, a mensagem deve especificar se existe ou no vaga
para o carro no estacionamento. Se no houver vaga, o carro partir sem entrar
no estacionamento. Quando um carro sair do estacionamento, a mensagem
dever incluir o nmero de vezes em que o carro foi manobrado para fora e
para dentro do estacionamento para permitir que outros carros sassem.

exerccio 22 Uma empilhadeira carrega caixas de 3, 5 e 7 toneladas. H trs


pilhas A, B e C. A pilha A onde se encontram todas as caixas que chegam no
depsito. Com um detalhe: caixas maiores no podem ser empilhadas sobre
caixas menores. Elabore um algoritmo que efetue o controle das caixas, de
forma que caso uma caixa de maior peso do que uma que j est em A deva
ser empilhada, todas as caixas que esto em A so movidas para as pilhas
auxiliares B (contendo somente caixa de 5 toneladas) e C (contendo somente
caixas de 3 toneladas) at que se possa empilhar a nova caixa. Depois, todas
as caixas so movidas de volta para a pilha A.

exerccio 23 Imagine um colecionador de vinhos que compra vinhos recen-


tes e os guarda em uma adega para envelhecerem, e que a cada ocasio
especial abre sempre sua ltima aquisio (para poupar os mais antigos).
Construa um programa que:

permita incluir novos vinhos na adega;


informe qual vinho deve ser aberto em uma ocasio especial;
relacione as cinco aquisies mais antigas.

As informaes bsicas que o registro de vinhos deve conter so: nome do


produto e safra.

exerccio 24 O problema das Torres de Hani bastante estudado em com-


putao. O problema consiste em N discos de diferentes dimetros e trs
estacas: A, B e C. Inicialmente os discos esto encaixados na estaca A onde o
Captulo 4 Pilhas e Filas 161

menor est sempre em cima do maior disco. O objetivo deslocar os discos


para uma estaca C, usando a estaca B como auxiliar. Somente o primeiro dis-
co de cada estaca pode ser deslocado. Construa a resoluo desse exerccio
considerando N = 4, ou seja, para quatro discos.

exerccio 25 Uma pilha pode ser usada para rastrear os tipos de escopos
encontrados em uma expresso matemtica e verificar se o uso deles est cor-
reto. Os delimitadores de escopo podem ser os parnteses, os colchetes e as
chaves. Escreva um programa que leia uma expresso matemtica e verifique
se os escopos esto posicionados de forma correta.

exerccio 26 Em um banco, deseja-se saber qual o tempo mdio que uma


pessoa fica na fila em um dia de grande movimento (por exemplo, dia de
pagamento). Para isso, so distribudos 100 bilhetes. Ao entrar na fila nica
dos caixas, a pessoa recebe um bilhete onde est marcada a hora de entra-
da. Ao ser atendida pelo caixa, nesse mesmo bilhete marcada a hora de
atendimento. Ao acabar de recolher os 100 bilhetes, eles so computados,
calculando-se o tempo mdio de espera de uma pessoa na fila do caixa nesse
perodo de amostragem. Faa um programa que simule esse ambiente. Para
isso, construa um algoritmo que gerencie a entrada do cliente na fila, outro
que gerencie a sada do cliente da fila, e um terceiro algoritmo para o clculo
do tempo mdio de espera na fila.

exerccio 27 Construa um programa que administre as filas de reservas de


filmes em uma locadora, sendo que para cada filme existem sete filas (uma
para cada dia da semana). O usurio quem determina qual o dia da se-
mana de sua preferncia para alugar um determinado filme. O programa
deve permitir incluses nas filas em qualquer ocasio e remoes das mesmas
apenas nos respectivos dias quando o cliente comunicado por telefone da
disponibilidade do filme e quando confirmada sua locao (caso no seja
locado, o prximo da fila ser procurado).

exerccio 28 O estacionamento Central possui uma nica alameda que guar-


da at 10 carros. Os carros entram pela extremidade sul do estacionamento
e saem pela extremidade norte. Se chegar um cliente para retirar um carro
que no esteja estacionado na posio do extremo norte, todos os carros ao
norte sero deslocados para fora, o carro sair do estacionamento e os outros
carros voltaro mesma ordem em que se encontravam inicialmente. Sempre
que um carro deixa o estacionamento, todos os carros ao sul so deslocados
162 Estruturas de Dados

para frente, de modo que o tempo inteiro todos os espaos vazios esto
na parte sul do estacionamento. Escreva um programa que leia um grupo
de linhas de entrada. Cada entrada contm um C (de chegada) e um P (de
partida), alm da placa do carro. O programa deve imprimir uma mensagem
cada vez que o carro chegar ou partir. Quando o carro chegar, a mensagem
dever especificar se existe ou no vaga para o carro. Se no existir vaga, o
carro esperar pela vaga ou at que uma linha de partida seja lida para o car-
ro. Quando houver espao disponvel, outra mensagem dever ser impressa.
Quando o carro partir, a mensagem dever incluir o nmero de vezes que o
carro foi deslocado dentro do estacionamento, incluindo a prpria partida
mas no a chegada. Esse nmero ser zero se o carro for embora a partir da
linha de espera. Presume-se que os carros sairo e partiro na ordem especi-
ficada pela entrada.

exerccio 29 Em um ambiente computacional em rede existe uma impresso-


ra que compartilhada por todos. Para gerenciar o uso dessa impressora, o
sistema operacional dispe de quatro filas circulares, a saber:

fila de entrada recebe as solicitaes de impresso de origem diversa;


fila 0 recebe todas as solicitaes de impresso da fila de entrada com
prioridade mxima;
fila 1 recebe as solicitaes de impresso da fila de entrada com prio-
ridade normal;
fila 2 recebe as solicitaes de impresso da fila de entrada com prio-
ridade baixa.

Cada nodo destas filas formado por um registro, com dois campos: Prio-
ridade e Identificao. As filas esto implementadas em quatro arranjos:
FE(50), F0(15), F1(15) e F2(15), respectivamente. A cada 0,5 segundos o
sistema operacional deve descarregar a fila de entrada, distribuindo as solici-
taes entre as filas com prioridade. Escreva um algoritmo que receba estas
filas e esvazie a fila de entrada, distribuindo as solicitaes de impresso em
suas respectivas filas de prioridades.

exerccio 30 Escreva um programa para simular um sistema de computador


multiusurio, como segue: cada usurio tem um ID exclusivo e deseja execu-
tar uma operao no computador. Entretanto, somente uma transao pode
ser processada por vez. Cada linha de entrada representa um nico usurio
Captulo 4 Pilhas e Filas 163

e contm o ID do usurio seguido de uma hora de incio e a durao de sua


transao. O programa deve simular o sistema e imprimir uma mensagem
contendo o ID do usurio e a hora em que a transao comeou e termi-
nou. No final da simulao, ele deve imprimir o tempo mdio geral de espe-
ra para uma transao (o tempo de espera de uma transao o intervalo
de tempo entre a hora em que a transao foi solicitada e a hora em que
ela foi iniciada).

exerccio 31 Simule uma agncia de banco que possua trs caixas atendendo
uma fila nica de clientes, de forma a determinar o tempo mdio de espera do
cliente na fila, para cada transao realizada (conforme tabela abaixo). me-
dida que qualquer um dos caixas fique livre, o primeiro cliente da fila o utiliza.
Quando o cliente entra na fila, o horrio anotado. Quando ele sai, verifica-se
o tempo que ele aguardou. O tempo que o cliente vai demorar no caixa vai
depender da transao a ser realizada. Na simulao, essa transao dever ser
aleatria e escolhida na tabela abaixo. Use um cronmetro para simular o tem-
po. Quando terminar o expediente (a ser definido pelo usurio e controlado pelo
cronmetro), o processo de atendimento imediatamente interrompido. Alm
de mostrar o tempo mdio de espera do cliente na fila, mostre quantas vezes
cada transao foi feita, quantos clientes foram atendidos e quantos clientes no
foram atendidos (os que estavam na fila na hora que terminou o expediente).

Transao Cdigo Tempo

Saldo 0 10
Saque 1 20
Aplicao 2 30
Extrato semanal 3 40
Extrato mensal 4 50
Pagamento de conta em dinheiro 5 60
Pagamento de conta em cheque 6 70
Pagamento de conta com saque 7 80

exerccio 32 Implemente uma aplicao para gerenciar o uso de 3 impres-


soras que esto ligadas a um computador. Sabe-se que o computador fica
enviando partes do documento para a impressora e no o documento inteiro
(somente se ele for pequeno). Por exemplo, se quisermos imprimir 5 arquivos
(Arq1, Arq2, Arq3, Arq4 e Arq5), o computador pega parte do Arq1 e envia
para a impressora-01, parte do Arq2 e envia para a impressora-02 e parte
164 Estruturas de Dados

do Arq3 e envia para a impressora-03. Faa isso com os outros arquivos at


que eles tenham sido completamente impressos. medida que um arquivo
termine de ser impresso, pegue o prximo arquivo da fila e inicie a sua im-
presso. Tome cuidado para que um arquivo no comece a ser impresso em
uma impressora e termine em outra. Considere que o computador mande
1kb de texto por vez para a impressora e cada impressora gaste 3 segundos
para imprimir 1kb de texto. No final, mostre quantos arquivos foram im-
pressos, quanto tempo (em segundos) cada uma das impressoras funcionou,
quanto (em kb) cada uma imprimiu e qual o tempo mdio de impresso dos
arquivos na fila.
captulo
???????? 5
???????
rvores

As rvores so umadas
estruturas
?????????????????????????
mais importantes
da rea de computao, com utilizao
??????????????????
em muitas
aplicaes do mundo real. Neste tipo de estrutura,
os relacionamentos lgicos entre os dados representam
alguma dependncia de hierarquia ou composio entre
os nodos, formando uma hierarquia de subordinao.
168 Estruturas de Dados

5.1 conceitos bsicos


Antes de iniciar a anlise desta estrutura de dados, nesta seo so apresenta-
dos alguns conceitos bsicos necessrios compreenso do restante do texto.

Uma rvore geralmente representada graficamente como mostrado na Fi-


gura 5.1. As linhas que unem dois nodos representam os relacionamentos
lgicos e as dependncias de subordinao existentes entre eles. Na figura
pode-se observar que o nodo A se relaciona somente com os nodos B, C e D,
e no com os demais. Por sua vez, o nodo B se relaciona com o A e tambm
com o E. Intuitivamente, observa-se que os relacionamentos do nodo B com
A e com E so diferentes existe uma hierarquia que faz com que o relaciona-
mento de A para B seja o mesmo que o de B para E, e que o relacionamento
de E para B seja o mesmo que o de B para A. A hierarquia de subordinao
mostra que um subconjunto dos nodos subordinado a outro nodo. Por
exemplo, o subconjunto de nodos H, I e J est subordinado ao nodo D.

Relacionamentos de subordinao, formando hierarquias, podem apresentar


diferentes significados, como:

hierarquias de especializao, representando classes e subclasses, confor-


me mostrado na Figura 5.2, na qual um veculo (classe) pode ser espe-

B C D

E F G H

I J

Figura 5.1 Representao grfica de uma rvore.


Captulo 5 rvores 169

VECULO

AREO TERRESTRE AQUTICO

AVIO HELICPTERO CARRO MOTOCICLETA MOTOR VELA REMO

NAVIO IATE LANCHA

Figura 5.2 Hierarquia de especializao.

cializado em areo, terrestre ou aqutico (subclasses). Cada uma dessas


classes pode, por sua vez, ser especializada em outras categorias;
hierarquias de composio, conforme mostrado na Figura 5.3. Neste
exemplo, o nodo que representa um carro composto por trs partes:
chassis, motor e rodas;
hierarquias de dependncia, como na Figura 5.4, que representa o orga-
nograma de uma empresa.

CARRO

CHASSIS MOTOR RODAS

Figura 5.3 Hierarquia de composio.

DIRETOR
SUPERINTENDENTE

DIRETOR DIRETOR DIRETOR


COMERCIAL FBRICA ADMINISTRATIVO

DEPTO. DEPTO. DEPTO.


PRODUO MANUTENO CONTR_QUAL.

Figura 5.4 Hierarquia de dependncia.


170 Estruturas de Dados

Existem outras formas de representar graficamente uma rvore, alm daquela


apresentada na Figura 5.1. A rvore representada na Figura 5.5a tambm
pode ser representada atravs das seguintes notaes:

diagramas de incluso, onde cada nodo representado por um crculo,


sendo os nodos subordinados representados dentro dos seus hierarquica-
mente superiores (Figura 5.5b);
diagramas de barras, nos quais, de forma semelhante a uma linguagem
indentada, os nodos so rotulados e representados por uma linha, com
indentao. A posio de cada nodo representa a sua posio na hierar-
quia (Figura 5.5c);
representao aninhada, na qual so utilizados parntesis para aninhar os
nodos subordinados a um determinado nodo (Figura 5.5d);
numerao por nveis, que utiliza uma numerao para cada nodo. O
nodo inicial de mais alta hierarquia recebe o nmero 1. Os demais nodos
recebem nmeros seqenciais, sempre precedidos pelo nmero do nodo
ao qual so subordinados (Figura 5.5e).

5.1.1 terminologia
A terminologia utilizada para referenciar conceitos envolvidos nas estruturas
de dados denominadas de rvores no padronizada, sendo utilizados no-

A (A((B(D))(C)))

B (d)
D C A

(b)
B C

A.........................
(a)
B..................
D
D...........
C.................. 1A; 1.1B; 1.1.1D; 1.2C
(c) (e)

Figura 5.5 Outras formas de representar uma rvore.


Captulo 5 rvores 171

mes diferentes para os mesmos conceitos em diferentes publicaes. A seguir


apresentada a terminologia empregada neste texto.

Raiz. um nodo diferenciado, presente em todas as rvores, ao qual so


subordinados todos os outros nodos da rvore. O acesso a todos os nodos da
rvore sempre feito a partir de sua raiz. Na Figura 5.6, o nodo denominado
de raiz aquele identificado como A.

Nodos descendentes. So os nodos que apresentam alguma relao de de-


pendncia com um nodo mais acima na hierarquia representada pela rvore.
Na figura 5.6, os nodos B e C so descendentes diretos da raiz (A), enquanto
que o nodo identificado como D seu descendente indireto.

Uma forma usual de indicar os graus de dependncia entre os nodos, prova-


velmente originria de rvores genealgicas, o de chamar os descendentes
diretos de um nodo de filhos (filhas ou sucessores) deste nodo, e o
nodo em questo, de pai (me, ascendente ou antecessor) de seus des-
cendentes diretos. Assim, todos os descendentes diretos de um nodo so
denominados de irmos (irms) entre si.

Subrvore. um conjunto de nodos, sendo todos eles subordinados a um


nico nodo, externo a esta subrvore. Na figura 5.7 so identificadas as se-
guintes subrvores da raiz A: B E, C F G, e D H I J.

Grau de um nodo. Denomina-se de grau de um nodo ao nmero de subr-


vores que so subordinadas diretamente a este nodo, ou seja, quantidade

Raiz
A

B C

Figura 5.6 Raiz de uma rvore e seus descendentes.


172 Estruturas de Dados

Raiz

B C D

E F G H

I J

Sub-rvore

Figura 5.7 Subrvores da raiz A.

de subrvores para as quais este nodo a raiz. s vezes tambm denomina-


do de grau de sada do nodo, representando o nmero de descendentes
que este nodo apresenta. Na rvore da Figura 5.7, por exemplo, a raiz (nodo
identificado como A) tem grau 3, pois apresenta 3 subrvores. Nesta mesma
figura, o nodo identificado com C tem grau 2, enquanto que o nodo F tem
grau zero.

Grau de uma rvore. O grau de uma rvore o maior valor dentre os


graus de todos os seus nodos. O grau da rvore representada na Figura 5.7
3, uma vez que este o maior grau de algum nodo desta rvore, no caso,
do nodo A.

Folha ou terminal (externo). Os nodos de grau zero (que no apresen-


tam descendentes) so denominados folhas ou terminais. Na rvore da
Figura 5.7, as folhas so os nodos E, F, G, I e J.

Nodo de derivao (interno). Os nodos de grau maior do que zero e


que, conseqentemente, apresentam alguma subrvore, so denominados
nodos de derivao ou nodos internos. Na rvore da Figura 5.7, os no-
dos A, B, C, D e H so nodos de derivao.
Captulo 5 rvores 173

Nvel de um nodo. O nvel de um nodo corresponde ao nmero de liga-


es entre este nodo e a raiz da rvore, acrescido de uma unidade. A raiz de
uma rvore tem sempre nvel 1. Os nodos ligados diretamente a ela (B, C e D
na rvore da Figura 5.7) apresentam nvel 2. Os nodos identificados como I e
J na Figura 5.7 apresentam nvel 4.

Caminho. Um caminho consiste em uma seqncia de nodos consecutivos


distintos entre dois nodos. Na Figura 5.7, o caminho entre os nodos A e J
formado pela seqncia de nodos A, D, H e J.

Comprimento do caminho. Dado um determinado caminho entre dois no-


dos, o comprimento deste caminho determinado pelo nmero de nveis en-
tre estes dois nodos, diminudo de uma unidade. O comprimento do caminho
entre os nodos A e J da Figura 5.7 3.

Altura ou profundidade. A altura de um dado nodo o nmero de


nodos do maior caminho deste nodo at um de seus descendentes-folha. A
altura ou profundidade da rvore igual ao maior nvel de seus nodos.
Todos os nodos-folha possuem altura 1. A altura da rvore da Figura 5.7 4,
indicando que existe um ou mais nodos a uma distncia de 3 nveis da raiz.

Floresta. formada por um conjunto de zero ou mais rvores disjuntas. A


Figura 5.8 mostra um exemplo de uma floresta composta por trs rvores.

rvore ordenada. Uma rvore dita ordenada quando a ordem de suas


subrvores relevante para a aplicao que est sendo representada atravs
desta estrutura de dados. Por exemplo, na Figura 5.9 so apresentadas duas

A E H

B C F G I

D J K

Figura 5.8 Exemplo de floresta.


174 Estruturas de Dados

A A


B C C B

Figura 5.9 rvores ordenadas.

rvores, cada uma com trs nodos. Nas duas, a raiz identificada por A. Alm
disso, nas duas rvores a raiz apresenta dois nodos descendentes, com as
mesmas identificaes (B e C). Caso estas duas rvores sejam ordenadas,
elas so diferentes entre si, pois os dois descendentes esto em ordem dife-
rente. Se a ordem entre os descendentes no relevante para a aplicao,
ento as duas rvores so iguais.

rvore binria / n-ria. Uma rvore dita binria quando apresen-


tar no mximo grau 2 em cada nodo. De modo semelhante, uma rvore de-
nominada n-ria quando apresentar no mximo grau n em cada nodo.

rvores isomorfas. Duas rvores no ordenadas so isomorfas quando


possvel que se tornem coincidentes atravs de uma permutao na ordem
das subrvores de seus nodos. Por exemplo, caso as duas rvores da Figura
5.9 no sejam ordenadas, elas so isomorfas.

rvore balanceada. Uma rvore balanceada aquela na qual existe uma


distribuio equilibrada entre os nodos da rvore, ou seja, existe uma diferen-
a mnima entre todas as folhas e a raiz. Uma rvore cheia ou completamente
balanceada aquela em que todas as folhas esto a uma distncia igual da
raiz. Na Figura 5.8, somente a rvore da esquerda no balanceada.

5.1.2 operaes sobre rvores


Com base na terminologia apresentada, uma rvore definida formalmente
como sendo o conjunto finito T de zero ou mais nodos, podendo ocorrer
duas situaes:

(1) caso o nmero de nodos da rvore seja diferente de zero,

existe sempre um nodo denominado raiz da rvore;


Captulo 5 rvores 175

os demais nodos formam m > 0 conjuntos disjuntos S1, S2,..., Sm, onde
cada um destes conjuntos , por sua vez, uma rvore, sendo as rvores Si
denominadas subrvores;

(2) caso o nmero de nodos da rvore seja zero, a rvore denominada


vazia.

rvores, como quaisquer estruturas de dados, requerem a definio das ope-


raes que podem ser realizadas sobre elas. As operaes bsicas sobre rvo-
res so as seguintes:

criao de uma rvore operao atravs da qual so alocadas as vari-


veis necessrias para a definio da rvore, e inicializadas suas variveis
de controle. As demais operaes ficam habilitadas somente depois da
execuo desta operao;
insero de um novo nodo em uma determinada posio a maneira
de formar a rvore, inserindo os nodos um a um. O novo nodo pode ser
inserido como a raiz, como uma folha ou em alguma posio intermedi-
ria da rvore;
excluso de um nodo utilizada para excluir um nodo de uma rvore. Esta
operao, quando no se realiza sobre uma folha, implica na reorganiza-
o da rvore;
acesso a um nodo para consulta ou atualizao dos valores internos de
um nodo;
destruio de uma rvore operao que executada quando uma rvo-
re existente no mais necessria.

Alm das operaes bsicas para manuteno de uma rvore, podem ser
identificadas outras que so muito utilizadas na manipulao desta estrutura
de dados devido sua forma particular de estruturao. Exemplos de outras
operaes que poderiam ser definidas:

pai dado um determinado nodo de uma rvore, esta operao retorna o


endereo do nodo imediatamente superior a ele na hierarquia, usualmen-
te denominado de seu pai;
tamanho operao que retorna o nmero total de nodos de uma rvore;
altura retorna a altura da rvore em questo.

Neste captulo no so detalhados os algoritmos que implementam as ope-


raes bsicas para rvores, devido complexidade que apresentam para r-
176 Estruturas de Dados

vores gerais. A implementao destas operaes ser vista somente para as


rvores binrias, apresentadas no captulo 6.

Tambm as rvores podem ser implementadas de duas maneiras: atravs de


contigidade fsica na memria, ou utilizando encadeamento. As duas alter-
nativas so analisadas a seguir.

5.2 rvores implementadas atravs


de contigidade fsica
A representao de uma rvore atravs de contigidade fsica no intuitiva
como era no caso das listas lineares. Deve ser estabelecida alguma estratgia
para a representao das hierarquias de subordinao entre os diferentes no-
dos, uma vez que esta no poder ser representada simplesmente atravs da
organizao linear das posies de um arranjo. Alm das informaes conti-
das nos nodos, o arranjo que implementar uma rvore dever conter informa-
es complementares, tais como nmero de sucessores de cada nodo, para
garantir sua fiel representao.

As operaes executadas sobre as rvores devem ser implementadas conhecen-


do e respeitando a estratgia de representao estabelecida na representao
fsica. Esta estratgia deve tambm ser conhecida pela aplicao que ir realizar
operaes sobre a rvore. Tratando-se de rvores, importante que se possa
acessar, atravs de operaes, os descendentes diretos de qualquer nodo, o
que pode no ser trivial tratando-se de contigidade fsica os descendentes
diretos podem estar bastante afastados fisicamente de seu antecessor.

As operaes bsicas sobre rvores implementadas atravs de contigidade


fsica so usualmente realizadas da seguinte forma:

insero ou remoo de um nodo estas duas operaes implicam quase


que via de regra em deslocamento de informaes ao longo do arranjo
utilizado para implementar a rvore. Na insero, uma vez localizada a
posio onde o novo nodo deve ser inserido, os nodos representados a
partir desta posio devem ser avanados de uma posio, para dar lu-
gar ao novo nodo. Na remoo de um nodo, os nodos seguintes devem
ser deslocados para ocupar a posio que ficou vaga. Alm disso, as in-
formaes complementares contidas nos nodos devero ser, a cada vez,
atualizadas;
Captulo 5 rvores 177

acesso a um nodo deve ser feito respeitando a hierarquia da rvore, per-


correndo-a de acordo com a estratgia utilizada na representao, com
auxlio das informaes complementares armazenadas para cada nodo.

Nas subsees a seguir so apresentadas duas estratgias diferentes para im-


plementao de rvores atravs de contigidade fsica, lembrando no serem
estas as nicas formas para este tipo de implementao.

5.2.1 implementao por nveis


A implementao por nveis inicia com a representao da raiz da rvore na
primeira posio a ser ocupada na memria. Nas posies seguintes so ar-
mazenados todos os sucessores diretos da raiz, em alguma ordem pr-esta-
belecida. Em seguida so representados os sucessores de cada um dos nodos
anteriores, de acordo com a mesma ordem utilizada no nvel anterior, e assim
por diante.

A Figura 5.10b mostra a implementao por nveis da rvore da Figura 5.10a.


A primeira posio traz o nodo raiz, representado por A. Para que a represen-
tao seja fiel necessrio informar, em cada nodo, o nmero de descenden-
tes que ele apresenta. Esta informao pode, por exemplo, ser armazenada

B C D

E F G H I
(a)

1 2 3 4 5 6 7 8 9 10
A(3) B(1) C(0) D(4) E(0) F(0) G(0) H(0) I(0)

(b)
1 2 3 4 5 6 7 8 9 10
A(3) B(1) E(0) C(0) D(4) F(0) G(0) H(0) I(0)

(c)

Figura 5.10 rvores implementadas atravs de contigidade fsica.


178 Estruturas de Dados

em algum campo especial junto s informaes correspondentes ao nodo.


Assim, no exemplo mostrado deve ser armazenado, alm das informaes
correspondentes ao nodo raiz A, o seu nmero de descendentes (3). Logo
aps a representao do nodo raiz so representados os seus descendentes
diretos, em alguma ordem pr-definida (no exemplo, da esquerda para a di-
reita), sendo a cada um associado o seu nmero de descendentes. Assim, na
segunda posio representado o nodo B com um descendente, seguindo os
nodos C (que no tem descendente) e D (com quatro descendentes). A seguir
so representados os descendentes dos nodos B, C e D, nesta ordem, e assim
por diante, at que todos os nodos sejam representados.

5.2.2 implementao por profundidade


Esta outra forma de implementao atravs de contigidade fsica inicia tam-
bm pela representao da raiz na primeira posio a ser ocupada na me-
mria. Em seguida representado o primeiro sucessor da raiz, seguido de
todos os seus sucessores. Depois representado o segundo sucessor da raiz,
seguido de seus respectivos sucessores. Isto repetido at que sejam repre-
sentados todos os sucessores da raiz.

A Figura 5.10c apresenta esta forma de implementao para a mesma rvore


representada na Figura 5.10a. Observa-se que a representao desta rvore
nesse caso diferente: iniciando pelo nodo raiz A, em seguida representado
o seu primeiro descendente B. A seguir representado o descendente do
nodo B, que o nodo E. Esgotados os descendentes de B, representado o
segundo descendente da raiz, o nodo C, que no apresenta descendentes.
Segue o terceiro descendente da raiz, D, seguido de seus descendentes, F, G,
H e I. A cada um dos nodos deve ser associado o seu nmero de descenden-
tes, para que a representao da rvore seja absolutamente fiel.

5.2.3 vantagens e desvantagens da implementao


por contigidade fsica
A implementao de rvores por contigidade fsica no constitui, em geral,
uma boa soluo para a representao fsica de rvores. A razo principal
a dificuldade que geralmente se tem de seguir a hierarquia implcita nestas
estruturas ao manipular a rvore. Alm disso, a insero e remoo de nodos
demorada, implicando quase sempre em completas reorganizaes da es-
trutura. Entretanto, esta forma de representao geralmente eficiente em
Captulo 5 rvores 179

termos de espao ocupado, principalmente quando o grau dos nodos no


varia muito.

A implementao fica simplificada caso exista alguma limitao no nmero


de descendentes de cada nodo, como no caso de rvores binrias ou tern-
rias. Por exemplo, considerando uma rvore ternria, como cada nodo s
pode apresentar trs descendentes, no necessrio armazenar o nmero de
descendentes diretos de cada nodo so reservadas, no arranjo, trs posies
para os descendentes de cada nodo. Deve ser utilizada alguma conveno
para informar se algum descendente no existe. Geralmente ser bastante
alto o nmero de elementos que informam somente que o nodo anterior no
apresenta descendente direto. Alm disso, a forma de identificar os descen-
dentes diretos de um nodo complexa, pois estes podero estar muito afas-
tados de seu antecessor. A Figura 5.11 apresenta uma rvore ternria e uma
possvel representao por nveis desta rvore, utilizando o smbolo para
representar a inexistncia de um descendente. Esta representao est consi-
derando a ordenao da rvore ao representar os descendentes: por exemplo,
considerando o nodo B, a posio 5 do arranjo informa que B no apresenta
descendente esquerda; a posio 6 contm o descendente central; e a posi-
o 7 informa que este nodo no tem descendente direita.

Essa forma de implementao apropriada em dois casos:

quando os nodos so processados exatamente na ordem em que foram ar-


mazenados, e no seguindo a hierarquia representada pela rvore; e

B C D

E F G

1 2 3 4 5 6 7 8 9 10 11 12 13

A B C D E F G

Figura 5.11 rvore ternria implementada atravs de contigidade fsica.


180 Estruturas de Dados

quando, excetuando a raiz, os demais nodos tm graus iguais ou muito se-


melhantes. Neste caso, a dificuldade de acesso hierarquia um pouco
minorada pela simetria da rvore, pois os algoritmos que implementam as
operaes podem encontrar, com um pouco mais de facilidade, os des-
cendentes de cada nodo. Alm disso, no haver desperdcio de espao
ocupado para representar informaes relativas inexistncia de nodos.

Esta forma de implementao constitui uma alternativa importante para o


arquivamento permanente de rvores. Neste caso, a estrutura representada
por encadeamento durante a manipulao convertida para contigidade
fsica ao ser armazenada. A operao inversa feita quando a estrutura
recuperada para manipulao.

5.3 rvores implementadas por encadeamento


Nesta forma de implementao, cada nodo da rvore representado por
uma varivel que deve apresentar, alm das informaes relativas a este
nodo, os endereos dos nodos que so seus descendentes diretos. O acesso
aos nodos de uma rvore implementada por encadeamento se d sempre
atravs do endereo da raiz, sendo os demais nodos alcanados somente
atravs dos endereos contidos nos campos de elo de cada nodo. Deste
modo, a hierarquia de subordinao, implcita nas rvores, fica perfeitamen-
te representada.

Na implementao fsica, todos os nodos da rvore devem apresentar a mes-


ma estrutura. Por isso, ao definir a estrutura para implementar uma determi-
nada rvore por encadeamento deve ser reservado um espao para armazenar

RAIZ

A A

B C D B C D

E F G E F G

Figura 5.12 rvore implementada atravs de encadeamento.


Captulo 5 rvores 181

tantos elos para descendentes quanto o valor do grau mximo que aparece
na rvore, ou seja, cada nodo ter tantos campos de elo quanto o maior n-
mero de descendentes presente em algum nodo da rvore.

A Figura 5.12 representa a implementao atravs de encadeamento da rvo-


re apresentada na Figura 5.11, lembrando que a rvore ordenada por nveis.
A estrutura escolhida para armazenar cada nodo prev a possibilidade de
qualquer nodo ter at trs descendentes (nmero de descendentes da raiz),
visto que apresenta trs campos de elo. O acesso a esta estrutura feito atra-
vs do endereo RAIZ. Nota-se que neste exemplo todos os campos esto
sendo utilizados somente na representao da raiz. Nos demais nodos, que
apresentam menor nmero de descendentes (ou nenhum, como o caso
das folhas da rvore), vrios campos de elo ficam ociosos. Este problema
pode ser significativo caso algum nodo apresente grau bem mais elevado
que os demais.

5.3.1 operaes bsicas


As operaes bsicas sobre rvores, quando implementadas atravs de enca-
deamento, so realizadas da seguinte forma:

criao da rvore consiste somente em inicializar no endereo nulo o


ponteiro que vai trazer o endereo da raiz da rvore;
insero de um novo nodo o novo nodo geralmente inserido como
uma folha. Depois de alocado o novo nodo, seu endereo colocado em
um dos campos de elo do nodo que ser seu pai (encadeamento). Caso
o nodo inserido seja o primeiro da rvore, ou seja, sua raiz, no haver
encadeamento com antecessor e seu endereo ser o de acesso a toda a
rvore;
remoo de um nodo o nodo liberado, e no campo de elo de seu pai
colocado o endereo nulo. Esta operao simples se o nodo a remover
for uma folha. Caso seja um nodo que possui descendentes, alguma es-
tratgia deve ser definida (remover tambm todos os descendentes, ou
reorganizar a rvore);
acesso a um nodo a rvore sempre acessada atravs da raiz, devendo
ser percorrida atravs dos campos de elo, at que o nodo desejado seja
encontrado. Este percurso deve ser feito com alguma disciplina, uma vez
que o acesso sempre do pai para o filho (no possvel, a partir de um
nodo filho, acessar seu pai). Durante o percurso muitas vezes necessrio,
182 Estruturas de Dados

cada vez que se vai acessar um filho, guardar o endereo do pai para, pos-
teriormente, poder acessar seus outros filhos;
destruio da rvore a rvore percorrida a partir de sua raiz, sendo
todos os nodos liberados.

5.3.2 vantagens e desvantagens da implementao


por encadeamento
Constata-se que a implementao de rvores por encadeamento bastante
intuitiva. Por este motivo, no restante deste texto somente ser considerada
esta forma de implementao para rvores.

rvores cujos nodos tm grau variado apresentam geralmente muitos cam-


pos de elo ociosos. Este problema pode ser significativo caso algum nodo
apresente grau bem mais elevado que os demais.

O acesso s informaes na rvore pode ser dificultado devido necessidade


de acessar qualquer nodo sempre atravs da raiz. Este problema minimiza-
do pela definio de disciplinas adequadas para percorrer os nodos da rvore.
Por outro lado, as operaes de insero e remoo de nodos so muito sim-
plificadas, consistindo basicamente na atualizao de endereos nos campos
de elo de alguns nodos.

Devido sua poderosa capacidade de representar dados de aplicaes, di-


versos tipos particulares de rvores foram desenvolvidos. No captulo que se-
gue analisado um tipo especfico de rvore, denominado rvore binria,
muito utilizado na prtica. Para estas so vistos os algoritmos das operaes
bsicas de manipulao, considerando sempre a implementao atravs de
encadeamento.

5.4 exerccios

exerccios com conceitos de rvores


exerccio 1 Considere a rvore a seguir, representada atravs de parnteses
aninhados:

( A (B) ( C (D (G) (H)) (E) (F (I)) ) )


Captulo 5 rvores 183

Represente esta mesma rvore atravs de:

diagrama de incluso;
representao hierrquica;
numerao por nveis.

exerccio 2 Para a mesma rvore do exerccio anterior, responda s pergun-


tas a seguir.

Quantas subrvores esta rvore contm?


Quais os nodos-folha?
Qual o grau de cada nodo?
Qual o grau da rvore?
Liste os ancestrais dos nodos B, G e I.
Identifique as relaes de parentesco entre os nodos.
Liste os nodos de quem C ancestral prprio.
Liste os nodos de quem D descendente prprio.
D o nvel e a altura do nodo F.
D o nvel e a altura do nodo A.
Qual a altura da rvore?

exerccio 3 Para uma rvore de grau d, determine:

o grau dos nodos internos da rvore;


o grau dos nodos-folhas;
o nmero de nodos da rvore caso o grau seja d e a altura h;
a altura da rvore, se o grau for d e o nmero de nodos n.

exerccios com rvores implementadas sobre arranjos


exerccio 4 Considere uma rvore cheia, de grau x.

Para alocao seqencial, por nveis, se um nodo estiver armazenado na


posio i de um arranjo, em quais posies estaro seus x filhos?
Considerando esta alocao seqencial, quais as conseqncias de inser-
es e eliminaes na rvore?

exerccio 5 Considere uma rvore armazenada em um arranjo denominado


ARVORE. Cada elemento do arranjo um registro com dois campos: INFO
184 Estruturas de Dados

(com a informao contida no nodo) e DESC (com o nmero de descendentes


deste nodo). Considere que no existe limitao do nmero de descendentes
que um nodo pode apresentar. Escolha uma estratgia de armazenamento e,
com base nesta estratgia, escreva algoritmos para:

acrescentar um novo nodo como descendente direto de um determinado


nodo da rvore;
remover um determinado nodo da rvore, identificado pelo contedo de
seu campo de informao;
procurar um determinado nodo atravs de seu campo de informao, re-
tornando o nmero de descendentes que apresenta;
informar os contedos dos campos de informao dos descendentes de
um determinado nodo;
alterar o campo de informao de um determinado nodo.

exerccio 6 Considere uma rvore ternria implementada sobre um arranjo,


usando a estratgia da implementao por nveis. Escreva algoritmos para
executar as operaes bsicas sobre esta rvore (inserir um nodo, remover um
nodo e acessar um determinado nodo). Repita este exerccio considerando a
implementao por profundidade.

exerccio 7 Para a mesma rvore ternria do exerccio anterior, ainda imple-


mentada sobre um arranjo, escreva uma funo que devolva o nmero de
nodos que a rvore apresenta.

exerccio 8 Tendo como entrada uma rvore ternria (Avr), implementada por
nveis conforme ilustrada na figura 5.11, e um valor (V), escrever um algoritmo
que localize esse valor na rvore. Se encontrado, calcule o nmero de nodos
das subrvores de V, recursivamente para cada subrvore a partir de V.

exerccio 9 Considere uma estrutura de armazenamento para rvores com-


posta dos dois arranjos mostrados na figura abaixo. Um deles (Vetor) contm
os nodos, armazenados em uma determinada ordem. O outro, um arranjo
auxiliar, indica, para cada nodo V, o ndice do nodo que segue imediatamente
subrvore da raiz V, se existir. Caso no exista, essa informao . Para a
rvore representada na figura a seguir, a estrutura de armazenamento seria
a seguinte:
Captulo 5 rvores 185

1 2 3 4 5 6 7 8 9
A
Vetor A B C D G H E F I

B C Auxiliar 3 7 6 8

D E F

G H I

Especifique uma funo para determinar os nveis dos nodos da rvore.

exerccio 10 As informaes relativas a uma determinada aplicao esto


armazenadas em uma estrutura de rvore qualquer, utilizando para isto um
arranjo A de uma dimenso, de 50 elementos. Cada elemento deste arranjo
representa um nodo da rvore, sendo composto por um registro com 3 cam-
pos o nome do item considerado, seu valor, e o nmero de descendentes
deste item:

Tipo T = registro
Nome: string
Valor: real
NrDesc: integer
fim registro

Com base nesta estrutura:

escreva um algoritmo que recebe este arranjo e um nome, e que impri-


me os nomes e valores dos descendentes do nodo que contm o nome
recebido. Caso o nome no seja encontrado em algum nodo da rvore, o
algoritmo dever escrever uma mensagem;
escreva um algoritmo para inserir um novo nodo na rvore. Este algoritmo
deve apresentar quatro parmetros: o arranjo A que armazena a rvore, o
nome NOVO_NOME e o valor NOVO_VALOR do nodo que deve ser includo na
rvore, e o valor VALOR_PAI correspondente ao nodo que ser o anteces-
sor (pai) do novo nodo. Considere que sempre haver espao para alocar
um novo nodo.
186 Estruturas de Dados

exerccios com rvores implementadas


atravs de encadeamento
exerccio 11 A partir dos dois arranjos utilizados na representao de uma
rvore no exerccio anterior (exerccio 9), escreva um algoritmo que gere a
mesma rvore implementada atravs de encadeamento. Suponha que cada
nodo pode ter no mximo quatro descendentes.

exerccio 12 Considerando uma rvore que pode ter no mximo quatro des-
cendentes por nodo, implementada por encadeamento, defina um tipo para
seus nodos e escolha uma forma de organizar os nodos (por nveis ou por
profundidade). Depois, escreva um algoritmo que recebe o endereo da raiz
desta rvore e que imprime todos os valores contidos em cada nodo, segui-
dos dos valores de seus descendentes.

exerccio 13 Considerando a rvore definida no exerccio anterior, escreva um


algoritmo que retorne a quantidade de nodos que tenham somente um filho.

exerccio 14 Construa um algoritmo que crie uma cpia de uma rvore com
nmero varivel de filhos.

exerccio 15 Escreva uma funo que recebe o endereo da raiz de uma r-


vore armazenada sore um arranjo e um valor de cdigo e retorna, se o cdigo
existir, uma lista encadeada contendo a cpia de todos os nodos dos filhos do
nodo que contem o cdigo, ou o endereo nulo caso esse cdigo no exista
na rvore.

exerccios de aplicaes
exerccio 16 Considere a rvore ternria abaixo, que apresenta categorias
de bebidas:

BEBIDA

REFRI VINHO CERVEJA

COCA PEPSI GUARAN TINTO BRANCO BRANCA PRETA


Captulo 5 rvores 187

Em cada nodo, alm do nome da bebida, deve ser armazenado seu preo e o
nmero de unidades disponveis para venda em um estabelecimento comer-
cial que utiliza esta estrutura.

Implemente esta rvore sobre um arranjo, por nveis.


Escreva um procedimento que liste o nome e o preo do tipo de bebida
fornecido como parmetro (refrigerante, vinho ou cerveja).
Escreva uma funo que informe o nmero de unidades disponveis para
venda de uma determinada bebida, fornecida como parmetro.

exerccio 17 Repita o exerccio anterior, implementando a rvore atravs de


encadeamento.

exerccio 18 Escreva um programa que permita montar e exibir a rvore


genealgica de uma pessoa.

exerccio 19 As informaes relativas a uma determinada aplicao esto


armazenadas em uma estrutura de rvore qualquer, como a da Figura 5.12.
Mostre uma possvel implementao desta rvore atravs de alocao seqen-
cial (utilizando arranjos) e outra atravs de encadeamento (com ponteiros).
Defina os tipos de variveis que seriam utilizados nas duas implementaes.
captulo
6
rvores binrias

Uma rvore binria apresenta o grau de cada nodo sempre


menor ou igual a 2 (ou seja, cada nodo apresenta no mximo
dois descendentes), podendo ou no ser ordenada. No caso
de ser ordenada, as subrvores de cada nodo so identificadas
por sua posio, sendo uma denominada de subrvore
esquerda e a outra de subrvore direita.
190 Estruturas de Dados

A Figura 6.1 apresenta trs tipos especiais de rvores binrias:

rvore estritamente binria (Figura 6.1a) toda a rvore em que cada


nodo tem grau 0 ou 2, ou seja, quando todo nodo apresenta 0 ou 2 fi-
lhos;
rvore binria completa (Figura 6.1b) uma rvore estritamente bin-
ria na qual todo nodo que apresente alguma subrvore vazia est localiza-
do no ltimo (folha) ou no penltimo nvel desta rvore;
rvore binria cheia (Figura 6.1c) quando todas as folhas esto
mesma profundidade, e todos os nodos internos tm grau 2. Uma rvore
cheia completa e estritamente binria.

A limitao do nmero de descendentes faz com que a implementao de


uma rvore binria se torne bastante simples. Na implementao por conti-
gidade fsica no necessrio representar em cada nodo o seu nmero de
descendentes, bastando reservar sempre espao para dois descendentes.
necessrio adotar alguma conveno para indicar os descendentes que no
existem por exemplo, algum valor que no faa parte do conjunto de va-
lores armazenado na rvore. A Figura 6.2 apresenta um exemplo da imple-
mentao de uma rvore binria (Figura 6.2a) sobre um arranjo (Figura 6.2b),
utilizando a representao por nveis (Seo 5.2.1). utilizado o smbolo

rvore Estritamente rvore Binria rvore Binria


Binria Completa Cheia
(a) (b) (c)

Figura 6.1 Tipos de rvores binrias.


Captulo 6 rvores Binrias 191

para representar a inexistncia de um determinado descendente, como no


caso do elemento de ndice 6 do arranjo, onde seria representado o descen-
dente esquerda do nodo F.

Na implementao de rvores binrias por encadeamento, a estrutura de um


nodo apresenta sempre dois campos de elo: um para o descendente es-
querda, e o outro para o da direita. A Figura 6.3 mostra a implementao da
rvore da Figura 6.2a atravs de encadeamento.

Na anlise das operaes bsicas a serem aplicadas em rvores binrias, feita


a partir da Seo 6.2, ser considerada somente a implementao atravs de
encadeamento, por ser esta a forma mais intuitiva para este tipo de estrutura
de dados.

Antes de analisar as operaes sobre rvores binrias, na prxima seo


apresentada a forma de transformar uma rvore n-ria em uma binria equi-
valente, permitindo que, para qualquer tipo de rvore, sejam utilizadas as
operaes que seguem.

B F

C E G

D
(a)

1 2 3 4 5 6 7 8 9 10 11 12 13

A B F C E G D
(b)

Figura 6.2 rvore binria implementada atravs de contigidade fsica.


192 Estruturas de Dados

RAIZ

B F

C E G

Figura 6.3 rvore binria implementada atravs de encadeamento.

6.1 transformao de rvore n-ria em binria


Mesmo que uma aplicao necessite estruturar seus dados atravs de uma r-
vore de grau mais elevado, sempre possvel transformar esta representao
em uma rvore binria equivalente. O objetivo desta transformao , alm
da facilidade de representao da rvore binria, possibilitar o uso dos algo-
ritmos correspondentes s operaes sobre rvores binrias, j desenvolvidos
e muito utilizados. A rvore binria gerada ter sempre o mesmo nmero de
nodos da rvore original. O processo de transformao mostrado a seguir,
passo a passo, tomando como base a rvore da Figura 6.4:

a raiz das duas rvores (da rvore n-ria que se quer transformar, e da binria
equivalente) a mesma (nodo A);
o primeiro descendente direto da raiz na rvore n-ria passa a ser o descen-
dente esquerda da raiz na rvore binria (B);
o segundo descendente da raiz (C), irmo de B, passa a ser o descendente
direita do anterior (B);
os demais descendentes da raiz passam a ser descendentes direita sempre do
irmo anterior. No exemplo, D passa a ser o descendente direita de C e,
caso houvesse outro irmo de B, este seria o descendente direita de D;
o processo executado para a raiz repetido para cada nodo da rvore original.

Resumindo, na rvore binria equivalente cada nodo apresentar seu primeiro


filho como descendente esquerda, e o irmo seguinte como descendente
Captulo 6 rvores Binrias 193

A
Primeiro
A filho
B
Irmo
E C
B C D

D
E F G
F

Figura 6.4 Representao de uma rvore n-ria atravs de uma binria.

direita. Caso a rvore original no seja ordenada, no relevante a ordem em


que so considerados os nodos de um mesmo nvel durante a transformao.

Tambm possvel representar uma floresta de rvores n-rias atravs de uma


nica rvore binria. Para isso, o seguinte processo deve ser seguido:

considerar as razes de todas as rvores da floresta como nodos irmos (esco-


lhendo uma ordem aleatoriamente);
para cada uma das rvores da floresta, efetuar a transformao antes apre-
sentada, representando-a como uma rvore binria a partir da raiz j inse-
rida na rvore resultante desta transformao.

A Figura 6.5 mostra como duas rvores n-rias podem ser representadas atra-
vs de uma nica rvore binria.

Cabe ressaltar que a rvore binria equivalente deve ser interpretada adequa-
damente, lembrando o significado dos descendentes. Uma vez executados os
processamentos requeridos na rvore equivalente, dever ser possvel voltar
representao original da rvore. O processo de reconverso da rvore binria
na n-ria correspondente mostrado a seguir, passo a passo, tomando como
base novamente as rvores da Figura 6.4:

a raiz das duas rvores (da rvore binria que se quer transformar, e da n-ria
equivalente) a mesma (nodo A);
194 Estruturas de Dados

A
B

B G
C D E
C H
F
D I

G F E J

H I J

Figura 6.5 Representao de uma floresta de rvores n-rias atravs de uma binria.

o descendente esquerda da raiz na rvore binria passa a ser o descendente


esquerda da raiz na rvore n-ria;
o descendente direta da raiz na rvore binria passa a ser irmo direita do
seu nodo pai na rvore n-ria. No exemplo, o nodo C passa a ser irmo
direita do nodo B e o nodo D passa a ser irmo direita do nodo C;
o processo executado para a raiz repetido para cada nodo da rvore original.

No caso em que a raiz da rvore binria possui uma subrvore direita,


esta subrvore ser a raiz de uma nova rvore n-ria, resultando em uma
floresta.

6.2 operaes sobre rvores binrias


Embora a implementao de rvores binrias possa ser realizada atravs de
contigidade fsica, somente a implementao atravs de encadeamento ser
considerada neste texto, devido natureza intuitiva que apresenta para este
tipo de estrutura de dados.

Nos algoritmos das operaes para rvores binrias sero considerados os


seguintes tipos de dados:
Captulo 6 rvores Binrias 195

TipoPtNodo = TipoNodo
TipoNodo = registro
Info: TipoInfo
Esq, Dir: TipoPtNodo
fim registro
TipoArvore = TipoPtNodo

6.2.1 criao de uma rvore vazia


Criar uma rvore binria implementada por encadeamento significa to
somente inicializar o ponteiro que ir guardar o endereo de seu nodo
raiz. O valor deste ponteiro inicializado no endereo nulo, indicando
que esta rvore est vazia, ou seja, que sua raiz ainda no foi alocada.
O nodo raiz somente ser alocado fisicamente no momento em que for
inserido o primeiro nodo na rvore. O procedimento a seguir implementa
esta operao.

Algoritmo 6.1 CriarArvore


Entradas:
Sada: Arv (TipoArvore)
incio
Arv nulo
fim

6.2.2 insero de um novo nodo


O primeiro nodo a ser inserido em qualquer rvore, seja ela binria ou no,
aquele que representar a sua raiz. Todas as demais inseres de nodos sero
feitas como descendentes de algum nodo j definido.

O processo de insero deve levar em considerao se a rvore binria ou


no ordenada. Caso no seja ordenada, a insero somente vai depender
da limitao de descendentes do nodo-pai. No caso de ser ordenada, a
aplicao deve informar a posio em que o novo nodo deve ser inserido,
se como descendente esquerda ou direita. A insero somente ser
realizada se este descendente especfico ainda no estiver presente. Os
algoritmos que sero apresentados neste captulo consideram rvores bi-
nrias ordenadas.

As operaes de insero da raiz e dos demais nodos so executadas de for-


ma diferente, analisadas separadamente, a seguir.
196 Estruturas de Dados

Para inserir o nodo raiz necessrio que a rvore tenha sido inicializada, e que
esteja vazia. A operao aloca o novo nodo, preenche seu campo de informa-
o com o contedo fornecido pela aplicao, e informa a esta o endereo do
nodo alocado. Toda a manipulao posterior desta rvore ser feita atravs
do endereo da raiz.

O algoritmo apresentado a seguir, aps alocar o novo nodo, inicializa os pon-


teiros para seus descendentes no endereo nulo, preenche o campo de infor-
mao com o contedo recebido (Valor) e devolve ao programa de aplicao
o endereo do nodo alocado (Arv).

Algoritmo 6.2 AlocarRaiz


Entrada: Valor (TipoInfo)
Sada: Arv (TipoArvore)
Varivel auxiliar: PtRaiz (TipoPtNodo)
incio
alocar(PtRaiz)
PtRaiz.Esq PtRaiz.Dir nulo
PtRaiz.Info Valor
Arv PtRaiz
fim

Uma vez tendo sido definida a raiz, um novo nodo pode ser inserido como
descendente esquerda ou direita de outro nodo j existente (nodo-pai).
Para tal, necessrio inicialmente identificar o endereo do nodo-pai. Isto
pode ser feito percorrendo a rvore procura de alguma informao contida
no campo de informao dos nodos, ou recebendo diretamente da aplicao
o endereo buscado.

A insero do novo nodo somente poder ser realizada caso o nodo identi-
ficado como nodo-pai ainda no possua o descendente especfico isto ,
caso seja solicitado inserir um descendente esquerda, o nodopai no po-
der apresentar descendente esquerda. A insero simples: basta alocar o
novo nodo e encade-lo a seu pai. Ressaltamos que est sendo considerada
somente a possibilidade de alocar nodos-folha.

Como exemplo desta operao, o algoritmo a seguir insere um filho esquer-


da de um determinado nodo, identificado pelo contedo de seu campo de
informao (ValorPai). So tambm fornecidos o endereo da raiz da rvore
(Arv) e a informao a ser inserida no novo nodo (ValorFilho). O parmetro
Captulo 6 rvores Binrias 197

Sucesso retornar falso no caso do nodo-pai no ser encontrado, ou quando


este j apresentar um descendente esquerda.

O algoritmo utiliza uma funo denominada Localizar que, dado o ende-


reo da raiz de uma rvore (Arv), devolve o endereo do nodo cujo campo
de informao igual a ValorPai. Caso este nodo no seja encontrado, a
funo devolve o endereo nulo. A funo Localizar ser detalhada mais
adiante (Algoritmo 6.6). Os algoritmos para percorrer uma rvore binria para
procurar um determinado nodo sero apresentados na Seo 6.2.4.1.

Algoritmo 6.3 InserirFilhoEsq


Entradas: Arv (TipoArvore)
ValorPai, ValorFilho (TipoInfo)
Sadas: Arv (TipoArvore)
Sucesso (lgico)
Variveis auxiliares: Pai, Novo (TipoPtNodo)
incio
Sucesso falso
Pai Localizar(Arv, ValorPai)
se (Pai nulo) e (Pai.Esq = nulo)
ento incio
Sucesso verdadeiro
alocar(Novo)
Novo.Dir Novo.Esq nulo
Novo.Info ValorFilho
Pai.Esq Novo
fim
fim

6.2.3 remoo de um nodo


A remoo de um nodo de uma rvore geralmente complexa, implicando
quase sempre em uma reorganizao de parte desta rvore. A remoo de
um nodo pode ser feita de duas formas:

a remoo lgica o nodo no fisicamente excludo. Alguma informa-


o especial contida no prprio nodo informa que este no mais vlido. A
estrutura da rvore integralmente preservada. Esta no a soluo ideal
no caso de a aplicao remover muitos nodos, pois todos ficaro alocados,
ocupando espao e fazendo com que pesquisas se tornem mais demora-
das, uma vez que todos os nodos removidos tambm so analisados;
198 Estruturas de Dados

b remoo fsica o nodo fisicamente excludo. Se o nodo considerado


uma folha, ele simplesmente liberado, devendo ser atualizado o elo
de seu nodo-pai. Entretanto, caso se trate de um nodo interno, a rvore
dever ser reorganizada.

A seguir mostrado um algoritmo que remove um nodo-folha de uma rvore


binria. O nodo a ser removido identificado pelo Valor de seu campo de
informao. Caso o nodo no seja encontrado, ou que no seja uma folha,
o algoritmo retorna Sucesso falso. Se for o nico nodo da rvore (sua raiz),
retorna a rvore vazia. O algoritmo utiliza uma funo LocalizarPai que
percorre a rvore em busca do nodo desejado, e retorna o endereo de seu
nodo-pai. Caso o nodo no seja encontrado, retorna endereo nulo.

Algoritmo 6.4 RemoverFolha


Entradas: Arv (TipoArvore)
Valor (TipoInfo)
Sadas: Arv (TipoArvore)
Sucesso (lgico)
Varivel auxiliar: Pai, Nodo (TipoPtNodo)
incio
se Arv.Info = Valor {NODO A RAIZ}
ento se (Arv.Dir = nulo) e (Arv.Esq = nulo)
ento incio
liberar(Arv)
Arv nulo
Sucesso verdadeiro
fim
seno Sucesso falso
seno incio
Pai LocalizarPai(Arv, Valor)
se (Pai nulo)
ento incio
se (Pai.Esq nulo) e (Pai.Esq.Info = Valor)
ento incio {FILHO A ESQUERDA}
Nodo Pai.Esq
se (Nodo.Esq = nulo) e (Nodo.Dir = nulo)
ento incio { FOLHA}
Sucesso verdadeiro
liberar(Nodo)
Pai.Esq nulo
fim
seno Sucesso falso
Captulo 6 rvores Binrias 199

fim
seno incio {FILHO A DIREITA}
Nodo Pai.Dir
se (Nodo.Esq = nulo) e (Nodo.Dir = nulo)
ento incio { FOLHA}
Sucesso verdadeiro
liberar(Nodo)
Pai.Dir nulo
fim
seno Sucesso falso
fim
fim
seno Sucesso falso
fim
fim

6.2.4 acesso aos nodos


Quando se quer acessar todos os nodos de uma rvore, obrigatoriamente
se passar mais de uma vez pelo mesmo nodo. O acesso arvore sempre
realizado atravs da raiz. Se esta raiz apresenta dois descendentes, o acesso a
cada um deles feito a partir dela, implicando que a raiz seja acessada duas
vezes. Geralmente se necessita acessar todos os nodos de uma rvore com o
objetivo de realizar a mesma operao sobre todos eles (por exemplo, pro-
curar um determinado nodo, imprimir os campos de informao de todos os
nodos, etc.). realizao desta operao sobre um nodo denominamos de
visita ao nodo.

Mesmo que se acesse um nodo diversas vezes durante o percurso da rvore,


a operao pretendida (visita) deve ser realizada somente uma vez sobre esse
nodo. necessrio definir uma estratgia de percurso desta rvore para que
isso seja possvel.

Denomina-se caminhamento de uma rvore o mtodo de percurso sistem-


tico de todos os nodos da rvore, de modo que cada nodo seja visitado exa-
tamente uma vez. Um caminhamento completo define uma seqncia de
nodos, de maneira que cada nodo da rvore passa a ter um nodo seguinte,
ou um nodo anterior, ou ambos (exceto rvores de um s nodo). Todos os
nodos da rvore devem aparecer nesta seqncia, cada um apenas uma vez.
A ordem em que os nodos aparecem no caminhamento completo representa
a ordem em que ser feita a visita aos nodos.
200 Estruturas de Dados

O objetivo buscado acessar todos os nodos da rvore pode ser alcanado


atravs de diferentes caminhamentos. A seqncia de nodos obtida ser di-
ferente conforme o caminhamento utilizado. Por exemplo, na Figura 6.6 so
apresentados dois possveis caminhamentos (caminhamento 1 por nveis e ca-
minhamento 2 por profundidade) que poderiam ter sido utilizados para percor-
rer uma determinada rvore alm deste, outros ainda podem ser definidos.

Como uma rvore binria apresenta no mximo dois descendentes em cada


nodo, ela pode ser vista como composta por sua raiz, com uma subrvore
esquerda desta raiz e outra subrvore sua direita (Figura 6.7). Os caminha-
mentos na rvore binria so definidos pela ordem em que so visitados estes
trs elementos a raiz e suas duas subrvores. Cada subrvore tambm
uma rvore binria, com uma raiz com suas duas subrvores. Visitar uma
subrvore significa visitar todos os nodos desta subrvore, utilizando para
estas visitas o mesmo caminhamento.

Os principais caminhamentos para rvores binrias so apresentados a seguir,


juntamente com a ordem em que devem ser realizadas as operaes corres-
pondentes sobre a rvore.

Caminhamento prefixado esquerda


1 visitar a raiz
2 percorrer e visitar a subrvore da esquerda
3 percorrer e visitar a subrvore da direita

Caminhamento prefixado direita


1 visitar a raiz
2 percorrer e visitar a subrvore da direita
3 percorrer e visitar a subrvore da esquerda

A
Caminhamento 1:
A-B-C-D-E-F-G
B C D
Caminhamento 2:
A-B-E-C-D-F-G
E F G

Figura 6.6 Caminhamentos para percorrer uma rvore binria.


Captulo 6 rvores Binrias 201

Raiz A

Subrvore B C Subrvore
esquerda direita

D E F G

Figura 6.7 rvore binria: raiz e subrvores.

Caminhamento ps-fixado esquerda


1 percorrer e visitar a subrvore da esquerda
2 percorrer e visitar a subrvore da direita
3 visitar a raiz

Caminhamento ps-fixado direita


1 percorrer e visitar a subrvore da direita
2 percorrer e visitar a subrvore da esquerda
3 visitar a raiz

Caminhamento central esquerda


1 percorrer e visitar a subrvore da esquerda
2 visitar a raiz
3 percorrer e visitar a subrvore da direita

Caminhamento central direita


1 percorrer e visitar a subrvore da direita
2 visitar a raiz
3 percorrer e visitar a subrvore da esquerda

Como exemplo, considerando a rvore apresentada na Figura 6.7, a visita


aos seus nodos, de acordo com o caminhamento utilizado, ter a seguinte
seqncia:

caminhamento prefixado esquerda a b d e c f g


caminhamento prefixado direita a c g f b e d
caminhamento central esquerda d b e a f c g
202 Estruturas de Dados

caminhamento central direita g c f a e b d


caminhamento ps-fixado esquerda d e b f g c a
caminhamento ps-fixado direita g f c e d b a

Um exemplo de aplicao para um determinado caminhamento a represen-


tao de uma expresso aritmtica em uma rvore binria, com os operandos
contidos nas folhas, e os operadores em nodos internos. Caso esta rvore seja
percorrida com o caminhamento correto, no caso o central esquerda,
a prioridade dos operadores estar garantida. A Figura 6.8 apresenta a re-
presentao de uma expresso aritmtica atravs de uma rvore binria, e a
seqncia de operaes realizadas atravs deste caminhamento que garan-
te a avaliao desta expresso de acordo com a prioridade dos operadores
aritmticos.

A seguir so apresentados alguns algoritmos de percurso sobre rvores


binrias.

percurso atravs de diferentes caminhamentos


Um algoritmo que percorre uma rvore binria recebe somente o endereo
da raiz da rvore, a partir da qual todos os outros nodos so acessados. Para
cada nodo acessado, suas duas subrvores devem ser percorridas, de acordo
com a ordem escolhida para o percurso. Assim, ao se alcanar um determina-
do nodo, passa-se a percorrer uma de suas subrvores, guardando de alguma
forma o endereo do nodo inicial para depois utiliz-lo para percorrer a se-
gunda subrvore. Isto geralmente feito com o auxlio de uma pilha.

* /

A B C D

(A * B) + (C / D)

Figura 6.8 rvore binria representando uma expresso aritmtica.


Captulo 6 rvores Binrias 203

Os algoritmos que correspondem aos trs caminhamentos, apresentados a


seguir, utilizam uma pilha para guardar informaes. Para a pilha so utiliza-
das as seguintes representaes simblicas:

a pilha representada por uma varivel Pilha, sem entrar em detalhes de


sua implementao, que pode ser sobre um arranjo ou atravs de enca-
deamento;
a pilha vazia simbolicamente representada por [ ];
a pilha guardar endereos de nodos;
o operador representa as operaes de inserir um endereo no topo da
pilha (pilha endereo) ou remover o endereo do topo da pilha (pon-
teiro pilha);
o procedimento visitar(PtNodo) simboliza a execuo da operao que se
quer realizar sobre cada nodo, podendo esta ser a pesquisa do valor conti-
do no nodo, a alterao do valor de seu campo de informao, etc.

caminhamento prefixado
Quando uma rvore binria percorrida atravs do caminhamento prefixado,
o primeiro nodo a ser visitado a raiz. Depois de feita a visita raiz, so visi-
tados todos os nodos de suas subrvores, na ordem requerida por exemplo,
se for caminhamento prefixado esquerda, so visitados primeiro os nodos
da subrvore da esquerda, depois os da direita.

Para implementar o caminhamento prefixado esquerda, uma vez feita a


visita raiz, antes de descer pela subrvore da esquerda deve ser guardado o
endereo da raiz da subrvore da direita, para que esta seja depois percorrida.
O algoritmo que implementa este caminhamento inicia colocando o endere-
o da raiz da rvore na pilha. Em seguida so repetidos os passos a seguir, at
que a pilha fique vazia:

1. retirar o endereo do topo da pilha;


2. se o endereo que estava no topo da pilha no for nulo:
2.1 fazer a visita ao nodo correspondente a este endereo;
2.2 colocar na pilha, nesta ordem, seus descendentes da direita
(guardando este endereo para mais tarde), e da esquerda (que
vai ficar no topo, para ser pesquisado).

O algoritmo que implementa estes passos recebe somente o endereo da raiz


da rvore. O algoritmo de Visitar no detalhado, pois vai depender da
operao que se quer realizar sobre cada nodo.
204 Estruturas de Dados

Algoritmo 6.5 PrefixadoEsq


Entrada: Arv (TipoArvore)
Sadas:
Variveis auxiliares:
PtAux (TipoPtNodo)
Pilha (TipoPilha)
incio
Pilha Arv
enquanto Pilha [ ]
faa incio
PtAux Pilha
se (PtAux nulo)
ento incio
Visitar(PtAux)
Pilha PtAux.Dir
Pilha PtAux.Esq
fim
fim
fim

O algoritmo que implementa o caminhamento prefixado direita seme-


lhante a este apresentado, invertendo somente a ordem em que os descen-
dentes de um nodo so inseridos na pilha: deve ser inserido primeiramente o
endereo do descendente da esquerda, e depois o da direita.

Como exemplo de percurso de uma rvore atravs de caminhamento prefixa-


do esquerda, a seguir mostrado o algoritmo da funo Localizar utili-
zada no Algoritmo 6.3. Esta funo percorre a rvore em busca de um nodo
com um determinado Valor em seu campo de informao. Neste exemplo,
o percurso poderia ser realizado em qualquer ordem, tendo sido aqui empre-
gado o caminhamento prefixado esquerda. Considera-se a implementao
da pilha sobre um arranjo Pilha, cujos elementos so endereos para nodos
da rvore, ou seja, cada elemento da pilha do tipo TipoPtNodo. A fun-
o devolve o endereo do nodo onde foi encontrado o Valor ou, caso no
encontre, o endereo nulo. So utilizadas, nesta funo, as operaes para
pilhas implementadas sobre arranjos, definidas no captulo 4.

Algoritmo 6.6 Localizar (Funo)


Entradas: Arv (TipoArvore)
Valor (TipoInfo)
Retorno: (TipoPtNodo)
Variveis auxiliares:
Captulo 6 rvores Binrias 205

PtAux (TipoPtNodo)
Achou, InsOK, OK (lgico)
Pilha (TipoPilha)
incio
InicializarPilhaArr(Base, Topo) {VARIVEIS GLOBAIS}
Achou falso
InserirPilhaArr(Pilha, Lim, Topo, Arv, InsOK) {INSERE RAIZ NA PILHA}
enquanto (Topo 0) e (no Achou) e (InsOK)
faa incio
RemoverPilhaArr(Pilha, Topo, Base, OK, PtAux)
se (PtAux nulo) e (OK)
ento se PtAux.Info = Valor
ento incio
Achou verdadeiro
Localizar PtAux
fim
seno incio
InserirPilhaArr(Pilha, Lim, Topo, PtAux.Dir, InsOK)
InserirPilhaArr(Pilha, Lim, Topo, PtAux.Esq, InsOK)
fim
fim
se (no Achou)
ento Localizar nulo
fim

caminhamento ps-fixado
Para mostrar como a disciplina escolhida para percorrer uma rvore altera os
algoritmos que implementam operaes sobre esta rvore, faremos agora a
mesma operao anteriormente apresentada, alterando somente a forma de
caminhamento para ps-fixado. Neste caso, a raiz dever ser o ltimo nodo
a ser visitado inicialmente so visitados todos os nodos da subrvore da es-
querda, depois todos os da subrvore da direita e, por ltimo, a raiz. Como o
acesso atravs da raiz, seu endereo deve ser guardado. Mas, como este en-
dereo vai ser acessado duas vezes antes de ser feita a visita a este nodo (uma
vez para cada subrvore), deve ser guardada alguma indicao suplementar
para indicar se este acesso o primeiro ou o segundo.

O algoritmo a seguir utiliza novamente uma pilha para guardar os ende-


reos dos nodos. Nesta pilha sero colocados os endereos dos nodos da
rvore, de duas formas: ou um endereo simples (quando um nodo aces-
sado pela primeira vez) ou um endereo marcado (alguma indicao que
206 Estruturas de Dados

sinalize que o nodo est sendo acessado pela segunda vez). Quando um
endereo retirado da pilha, se for um endereo simples, o mesmo no-
vamente retornado pilha, desta vez marcado, acrescido dos endereos de
suas subrvores. Quando um endereo marcado removido da pilha, isto
indica que este nodo pode agora ser visitado, pois suas duas subrvores j
foram visitadas.

Esta estratgia utilizada no algoritmo apresentado a seguir que implementa


o caminhamento ps-fixado esquerda. O algoritmo recebe somente o en-
dereo da rvore, e a percorre realizando uma visita a cada nodo, na ordem
definida pelo caminhamento em questo. A operao executada durante a
visita a um nodo no especificada, estando representada no algoritmo atra-
vs de uma chamada a um procedimento denominado Visitar. Tambm
no esto detalhados os algoritmos das funes Marcado (funo lgica que
verifica se um determinado endereo da pilha est marcado) e Marcar (fun-
o que marca um endereo a ser inserido na pilha).

Algoritmo 6.7 Ps-FixadoEsq


Entrada: Arv (TipoArvore)
Sadas:
incio
Pilha Arv
enquanto Pilha [ ]
faa incio
PtAux Pilha;
se (PtAux nulo)
ento se Marcado(PtAux)
ento Visitar(PtAux)
seno incio
Pilha Marcar(PtAux)
Pilha PtAux.Dir
Pilha PtAux.Esq
fim
fim
fim

caminhamento central
A forma de percorrer uma rvore atravs de caminhamento central, tanto
esquerda como direita, tambm pode ser implementada utilizando uma
pilha, de modo semelhante ao do caminhamento ps-fixado esquerda
Captulo 6 rvores Binrias 207

apresentado anteriormente. A nica diferena consiste na ordem em que os


endereos so colocados na pilha, para que a raiz seja visitada antes de sua
subrvore da direita.

operaes de acesso implementadas atravs


de algoritmos recursivos
Uma rvore binria uma estrutura implicitamente recursiva: formada por
uma raiz, com uma subrvore esquerda e outra subrvore direita. Cada
uma destas subrvores, por sua vez, tm a mesma estrutura: uma raiz e duas
subrvores, uma esquerda e a outra direita. Isso faz com que se torne
natural a utilizao de procedimentos recursivos para percorrer rvores bin-
rias. Os algoritmos recursivos so muito mais simples, uma vez que a pilha,
implementada explicitamente nos algoritmos anteriores, agora tratada dire-
tamente pelas chamadas recursivas.

Por exemplo, a implementao do percurso prefixado esquerda para percor-


rer uma rvore binria iniciada fazendo a visita raiz. Em seguida deve ser
percorrida toda a subrvore esquerda atravs do mesmo caminhamento, o
que feito atravs de uma chamada recursiva para a subrvore da esquerda,
entregando-lhe o endereo da raiz desta subrvore. Durante a execuo desta
chamada recursiva, outras chamadas recursivas sero feitas, uma para cada
subrvore desta. Quando terminar a execuo da primeira chamada recursiva,
toda a subrvore da esquerda foi percorrida. feita, ento, outra chamada
recursiva, entregando agora o endereo da raiz da subrvore da direita, cha-
mada esta que vai percorrer esta segunda subrvore. As chamadas recursivas
param depois de chegar em uma folha, pois vo receber endereos nulos
para as subrvores.

A seguir mostrado o algoritmo que percorre uma rvore binria atravs de ca-
minhamento prefixado esquerda, utilizando recursividade. A operao reali-
zada sempre que o endereo recebido seja vlido (diferente de nulo), efetuando
a visita ao nodo recebido e fazendo as chamadas recursivas para as suas subr-
vores. Quando uma chamada recebe um endereo nulo, nada executado.

Algoritmo 6.8 PrefixadoEsqRec


Entrada: Arv (TipoArvore)
Sadas:
incio
se Arv nulo
208 Estruturas de Dados

ento incio
Visitar(Arv)
PrefixadoEsqRec(Arv.Esq))
PrefixadoEsqRec(Arv.Dir)
fim
fim

Os algoritmos recursivos para percorrer rvores binrias atravs dos outros tipos
de caminhamentos so muito semelhantes a este mostrado acima, adequando
somente a ordem das chamadas recursivas e da visita raiz. A seguir so mos-
trados os algoritmos para os caminhamentos ps-fixado e central esquerda.

Algoritmo 6.9 Ps-FixadoEsqRec


Entrada: Arv (TipoArvore)
Sadas:
incio
se Arv nulo
ento incio
Ps-fixadoEsqRec(Arv.Esq))
Ps-fixadoEsqRec(Arv.Dir)
Visitar(Arv)
fim
fim

Algoritmo 6.10 CentralEsqRec


Entrada: Arv (TipoArvore)
Sadas:
incio
se Arv nulo
ento incio
CentralEsqRec(Arv.Esq))
Visitar(Arv)
CentralEsqRec(Arv.Dir)
fim
fim

6.2.5 destruio de uma rvore

Quando uma rvore alocada durante uma aplicao no for mais necessria,
todas as posies ocupadas por seus nodos podem ser liberadas. Isto pode ser
feito percorrendo toda a rvore atravs de um dos caminhamentos ps-fixados,
liberando cada um dos nodos alocados (a visita ao nodo a sua liberao).
Captulo 6 rvores Binrias 209

necessrio que o caminhamento de percurso seja ps-fixado para que a libera-


o de um nodo somente seja feita quando todos os seus descendentes foram
liberados. O ltimo nodo a ser liberado ser a raiz. A operao de destruio de
uma rvore dever retornar nulo o endereo de acesso a esta rvore.

6.3 exemplos de aplicaes que


utilizam rvores binrias
Nesta seo so apresentados alguns exemplos de aplicaes de rvores bin-
rias, utilizando sempre as solues recursivas, mais apropriadas s rvores. Fica
a sugesto de adaptar os algoritmos apresentados para o caso de no se querer
utilizar a recursividade (para tornar o algoritmo mais eficiente, ou por no dis-
por deste recurso na linguagem de programao utilizada na implementao).

6.3.1 construo de uma rvore


A operao de construo de uma rvore depende da ordem em que so
fornecidos os valores para seus nodos. Deve ser escolhido um caminhamen-
to adequado a esta ordem. A rvore gerada estar diretamente relacionada
ao caminhamento escolhido isto , dever ser percorrida posteriormente
atravs do caminhamento para o qual foi gerada. Por exemplo, a Figura 6.9
mostra a ordem em que devem ser fornecidos os valores para que seja cons-
truda a rvore binria apresentada, considerando o caminhamento prefixado
esquerda: o primeiro valor obtido ser o da raiz, o prximo ser o de seu
filho esquerda, e assim por diante. Os asteriscos representam algum dado
que informe que no existe o descendente buscado.

O algoritmo a seguir mostra, em passos gerais, como pode ser gerada esta
rvore a partir dos dados obtidos:

1 alocar o nodo correspondente raiz;


2 preencher o campo de informao da raiz com o primeiro valor obtido;
3 construir a subrvore da esquerda (chamada recursiva), e colocar o ende-
reo da raiz desta subrvore no elo esquerda do nodo raiz;
4 construir a subrvore da direita, e colocar o endereo de sua raiz no elo
direita da raiz da rvore que est sendo montada.

O prximo algoritmo constri uma rvore ou uma subrvore, dependendo


do momento em que chamado. O endereo do nodo alocado devolvido
210 Estruturas de Dados

B C

D E F

G H

ABD**EG**H**C*F**

Figura 6.9 Ordem de valores para gerar rvore com caminhamento prefixado
esquerda.

atravs do parmetro Arv. As chamadas recursivas solicitam a construo das


subrvores, sendo os endereos das razes destas subrvores colocados nos
campos de elo esquerdo e direito do nodo considerado. O algoritmo utiliza
uma funo denominada ObtmInfo que obtm a informao a ser inserida
no campo de informao do novo nodo. Quando esta funo devolver o
caractere * sinal de que foi alcanado o final de um ramo da rvore,
sendo inserido o endereo nulo como endereo da subrvore construda.

Algoritmo 6.11 ConstruirArv


Entradas:
Sada: Arv (TipoArvore)
Varivel auxiliar: InfoProx (TipoInfo)
incio
InfoProx ObtmInfo
se InfoProx = "*"
ento Arv nulo
seno incio
alocar(Arv)
Arv.Info InfoProx
ConstruirArv(Arv.Esq)
ConstruirArv(Arv.Dir)
fim
fim
Captulo 6 rvores Binrias 211

Ressaltamos que este algoritmo somente poder ser utilizado caso os valores
sejam fornecidos de acordo com o caminhamento prefixado esquerda. Se
os valores forem informados em outra ordem, o algoritmo para a construo
da rvore dever ser adaptado.

6.3.2 montagem de uma lista a partir de uma rvore


A aplicao a seguir mostra como pode ser montada uma lista linear sim-
plesmente encadeada a partir das informaes contidas nos nodos de uma
rvore binria. Os nodos da lista montada tero dois campos: um campo
de informao idntico ao campo de informao dos nodos da rvore, e
outro com o elo para o prximo nodo da lista. A lista montada a partir
do ltimo nodo, que vai conter a informao da raiz da rvore, alocando
e encadeando os novos nodos na frente da lista, como mostrado na Figu-
ra 6.10. Se a lista montada for percorrida a partir de seu incio, os nodos
encontrados correspondem a percorrer a rvore atravs do caminhamento
ps-fixado direita.

Arv

2 6

1 3 5 7

Lista

7 5 6 3 1 2 4

Figura 6.10 Lista linear montada a partir de rvore binria.


212 Estruturas de Dados

O algoritmo a seguir implementa esta operao. Ele recebe o endereo da raiz


da rvore e devolve, atravs de outro parmetro, o endereo do nodo inicial
da lista. Caso o endereo recebido como raiz da rvore seja nulo, o algoritmo
devolve o endereo nulo para o incio da lista. O algoritmo recursivo: aloca
um novo nodo para a lista e o encadeia com aquele que era o primeiro da
lista, passando este a ser o primeiro; em seguida, faz uma chamada recursiva
para cada um de seus descendentes (esquerdo e direito). Ao final de cada
uma das chamadas recursivas estar montada a lista correspondente a toda
a subrvore.

Algoritmo 6.12 FazerListaDeArv


Entrada: Arv (TipoArvore)
Sada: Lista (TipoPtLista)
Varivel auxiliar: PtListaAux (TipoPtLista)
incio
se Arv nulo
ento incio
alocar(PtListaAux)
PtListaAux.Info Arv.Info
se Lista = nulo
ento PtListaAux.Prox nulo
seno PtListaAux.Prox Lista
Lista := PtListaAux
FazerListaDeArv (Arv.Esq, Lista)
FazerListaDeArv(Arv.Dir, Lista)
fim
fim

6.3.3 clculo do valor de uma expresso aritmtica


Como mostrado na Figura 6.8, a representao de uma expresso aritmtica
atravs de uma rvore binria permite sua avaliao de acordo com a prio-
ridade dos operadores. Esta forma de rvore gerada pelo analisador sint-
tico de um compilador ao fazer o reconhecimento da expresso. A seguir
apresentada uma funo que avalia uma expresso aritmtica a partir de sua
representao em rvore binria.

A rvore gerada apresenta dois tipos de nodos, com semnticas diferentes:


alguns representam um operando (valores numricos ou valores de variveis),
outros um operador. Para diferenciar os nodos, o algoritmo a seguir utiliza
Captulo 6 rvores Binrias 213

um campo especial em cada nodo, denominado Tipo, que informa o tipo


de informao que o nodo contm. O valor de Tipo = 0 corresponde a um
operando, e Tipo = 1, a um operador. Alm disso, operandos e operadores
tm tipos diferentes, devendo ser armazenados em campos diferentes, aqui
denominados de Valor (numrico, para o operando), e Oper (do tipo ca-
ractere, para o operador). Os nodos desta rvore tm, portanto, a seguinte
estrutura:

TipoNodoEA = registro
Tipo: inteiro
Oper: caractere
Valor: real
Esq, Dir: TipoNodoEA
fim registro
TipoPtNodoEA = TipoNodoEA

utilizado o caminhamento central esquerda para processar a expresso


aritmtica. A operao a ser realizada pela funo depende do tipo do nodo:
caso seja um operando, o resultado o valor contido no nodo; caso seja um
operador, o resultado da funo dado pelo resultado da aplicao deste
operador ao resultado obtido nas subrvores da esquerda e da direita do
nodo em questo, resultado este obtido atravs de chamadas recursivas, for-
necendo a raiz da subrvore correspondente. A funo devolve o valor zero
caso receba um endereo nulo para a raiz da rvore ou quando o valor corres-
pondente ao TIPO for invlido.

Algoritmo 6.13 ValorEA (Funo)


Entrada: Arv (TipoArvore)
Retorno: (real)
incio
se (Arv = nulo) ou ((Arv.Tipo 0) e (Arv.Tipo 1))
ento ValorEA 0
seno se Arv.Tipo = 0 {OPERANDO}
ento ValorEA Arv.Oper
seno caso Arv.Oper seja {OPERADOR}
"+": ValorEA ValorEA(Arv.Esq) + ValorEA(Arv.Dir)
"-": ValorEA ValorEA(Arv.Esq) ValorEA(Arv.Dir)
"*": ValorEA ValorEA(Arv.Esq) * ValorEA(Arv.Dir)
"/": ValorEA ValorEA(Arv.Esq) / ValorEA(Arv.Dir)
fim caso
fim
214 Estruturas de Dados

6.4 rvores binrias de pesquisa


rvores binrias que apresentam uma relao de ordem nos campos de in-
formao de seus nodos so denominadas rvores Binrias de Pesquisa
(ABP). A ordem definida pelo valor contido em um determinado campo de
informao dos nodos, aqui denominado chave.

A ordem entre os nodos de uma ABP a seguinte: para qualquer nodo de uma
ABP, todos os nodos de sua subrvore da esquerda contm valores de chave
menores do que a do nodo considerado, e todos os nodos da subrvore da
direita apresentam valores de chave maiores ou iguais chave do nodo consi-
derado. A possibilidade de uma ABP apresentar chaves duplicadas depende da
aplicao que estiver sendo representada: algumas aplicaes requerem que
as chaves sejam nicas, enquanto que outras permitem chaves repetidas.

A Figura 6.11 apresenta um exemplo de ABP na qual esto representados


somente os valores das chaves outros valores de informao, no represen-
tados na figura, podem estar contidos nos nodos. Neste exemplo, os nodos
da rvore esto em ordem crescente caso a rvore seja percorrida atravs de
caminhamento central esquerda, e em ordem decrescente caso a rvore seja
percorrida atravs de caminhamento central direita.

Devido ordem que apresentam, estas rvores so eficientes para pesquisar


valores, ou seja, procurar as informaes associadas a uma determinada cha-
ve da o nome dado a este tipo de rvore. No exemplo da figura 6.11, sabe-
se que para qualquer nodo, todos os nodos de sua subrvore esquerda
tm chaves menores, e todos os nodos de sua subrvore direita tm chaves

500

300 800

150 400 600 900

Figura 6.11 Exemplo de rvore binria de pesquisa.


Captulo 6 rvores Binrias 215

maiores. Portanto, para encontrar um nodo com uma determinada chave


nesta ABP, inicia-se comparando a chave buscada com a da raiz. Caso seja
diferente, o caminho a seguir ser definido verificando se a chave procurada
maior ou menor do que a chave do nodo considerado. Isto permite que a
pesquisa siga em somente um dos ramos, sendo o outro ramo imediatamen-
te descartado, diminuindo consideravelmente o nmero de nodos a analisar
e, conseqentemente, o tempo gasto na pesquisa. Por exemplo, na Figura
6.11, caso seja buscado o nodo cuja chave vale 600, efetuado o seguinte
procedimento:

1 compara-se o valor buscado (600) com a chave da raiz (500). Como so di-
ferentes e sendo o valor buscado maior do que a chave da raiz, a pesquisa
segue pela subrvore da direita;
2 o segundo nodo analisado , ento, a raiz da subrvore da direita, cuja
chave 800. Neste caso, sendo ainda diferente da chave buscada, e sendo
esta menor do que a deste nodo, a pesquisa segue pela subrvore da es-
querda;
3 o prximo nodo analisado, raiz da subrvore da esquerda do anterior,
possui a chave igual buscada.

Vemos, portanto, que o nodo buscado foi encontrado analisando somente


trs nodos da rvore, bem menos do que se a pesquisa fosse realizada sem le-
var em considerao a ordem em que se encontram as chaves dos nodos. Isto
significa que, para qualquer pesquisa, o nmero mximo de comparaes
efetuadas igual ao nmero de nveis da rvore.

As operaes bsicas sobre ABPs so analisadas a seguir. Tratando-se de um


caso particular de rvore binria, as operaes de criao e destruio da r-
vore so as mesmas apresentadas anteriormente. Sero vistas aqui, portanto,
as operaes de insero de um novo nodo (respeitando a ordem), remoo
de um nodo, e busca (pesquisa) de um determinado nodo.

Os tipos de dados utilizados nos algoritmos para ABP so os seguintes:

TipoPtNodoABP = TipoNodoABP
TipoNodoABP = registro
Info: TipoInfo
Chave: inteiro
Esq, Dir: TipoPtNodoABP
fim registro
216 Estruturas de Dados

6.4.1 insero de um novo nodo


A insero de um novo nodo em uma ABP deve respeitar a ordem apresenta-
da pelas chaves dos nodos, ou seja, a rvore resultante deve continuar orde-
nada aps a insero. Uma forma de garantir esta ordem inserindo sempre
os novos nodos como folhas. A posio onde um novo nodo vai ser inserido
definida por sua chave. Por exemplo, a Figura 6.12 mostra as posies onde
devem ser inseridos dois novos nodos na ABP da Figura 6.11, um com valor
de chave 380 e o outro com 750.

A seguir mostrada uma funo que insere um nodo em uma ABP. Considera-
se que no existam chaves duplicadas. Para inserir um novo nodo feita uma
pesquisa a partir da raiz da rvore, comparando a chave de cada nodo com a
chave do nodo a ser inserido se a chave do novo nodo for maior, o nodo de-
ver ser inserido na subrvore da direita do nodo em questo; caso contrrio,
ser inserido na sua subrvore da esquerda. Como as chaves dos nodos so
nicas, a nova insero no dever ser realizada caso seja encontrado algum
nodo com a chave igual ao nodo que se quer inserir. A insero ser efetivada
no momento em que se encontrar uma folha da rvore, quando ento o novo
nodo ser inserido como folha da anterior.

Por exemplo, para se encontrar a posio onde deve ser inserido o nodo com
chave 380 no exemplo da Figura 6.12 feita, inicialmente, a comparao
deste valor com a chave da raiz da rvore. A chave desta raiz sendo 500, a

500

300 800

150 400 600 900

380 750

Figura 6.12 Insero de dois novos nodos na ABP.


Captulo 6 rvores Binrias 217

insero dever ser realizada na subrvore da esquerda, pois 380 menor do


que 500. A chave da raiz desta subrvore 300, indicando que a insero de-
ver ser realizada na subrvore da direita deste nodo. Nesta, a chave da raiz
400, indicando a insero na subrvore da esquerda desta; entretanto, como
esta subrvore no existe, o novo nodo inserido como folha esquerda do
nodo de chave 400.

O algoritmo apresentado a seguir considera que o novo nodo j foi alocado


e preenchido, sendo seu endereo fornecido atravs do parmetro Novo. O
objetivo , portanto, achar a posio em que este nodo deve ser inserido, de
modo a preservar a caracterstica de ordenamento da rvore, e fazer o enca-
deamento. A operao realizada por uma funo lgica. Como as chaves
devem ser nicas, a funo retorna falso caso j exista um nodo com esta
chave na rvore, devendo ento a aplicao remover o nodo anteriormente
alocado. A pesquisa realizada por uma funo (BuscarABP) que ser apre-
sentada na Seo 6.4.3 (Algoritmo 6.16), que procura um nodo com uma de-
terminada chave em uma ABP, retornando seu endereo, ou o endereo nulo
caso no a encontre. Caso a chave no seja encontrada na rvore, a funo
InserirABP passa a procurar onde o novo nodo deve ser inserido. Caso seja
o primeiro nodo a ser inserido na rvore (quando o endereo recebido para
Raiz for nulo), o novo nodo passar a ser a raiz. Se a rvore j possuir nodos,
a funo passar a efetuar as comparaes, descendo pela subrvore adequa-
da at chegar em uma folha, quando ento o novo nodo encadeado.

Algoritmo 6.14 InserirABP (Funo)


Entradas: Raiz (TipoPtNodoABP)
Novo (TipoPtNodoABP) {NOVO NODO, J ALOCADO}
Sadas: Raiz (TipoPtNodoABP)
Retorno: (lgico)
Variveis auxiliares:
PAux (TipoPtNodoABP)
Inseriu (lgico)
incio
se BuscarABP(Raiz, Novo.Chave) nulo
ento InserirABP falso {CHAVE J EXISTE NA RVORE}
seno incio
InserirABP verdadeiro
se Raiz = nulo
ento Raiz Novo {INSERIR PRIMEIRO NODO RAIZ}
seno incio {BUSCA POSIO E INSERE}
PAux Raiz
218 Estruturas de Dados

Inseriu falso
enquanto no Inseriu
faa se Novo.Chave > PAux.Chave
ento se PAux.Dir = nulo
ento incio
PAux.Dir Novo
Inseriu verdadeiro
fim
seno PAux PAux.Dir
seno se PAux.Esq = nulo
ento incio
PAux.Esq Novo
Inseriu verdadeiro
fim
seno Paux PAux.Esq
fim
fim
fim

Note que a ordem em que os nodos so inseridos em uma ABP importan-


te para a configurao resultante. Na Figura 6.13 so apresentadas duas
ABPs diferentes, geradas a partir dos mesmos dados, fornecidos em ordem
diferente.

30 25

25 40 22 40

20 27 45 20 30 45

22 27

30 - 25 - 20 - 22 - 40 - 27 - 45 25 - 22 - 40 - 30 - 45 - 27 - 20

Figura 6.13 Ordem de insero dos nodos em uma ABP e rvores resultantes.
Captulo 6 rvores Binrias 219

6.4.2 remoo de nodo


Como visto na Seo 6.2.3, a operao de remoo de um nodo de uma r-
vore complexa, implicando quase sempre em uma reorganizao de parte
desta rvore. No caso de uma ABP, esta reorganizao deve ser feita de modo
a preservar a ordem das chaves.

Quando for realizada uma remoo lgica de um nodo (quando o nodo


permanece alocado, com alguma informao de que ele no mais vlido),
necessrio que a chave deste nodo permanea acessvel, podendo ser utiliza-
da nas buscas para identificar qual a subrvore que deve ser seguida a partir
deste nodo.

A seguir analisada a alternativa de remoo fsica de nodos. Dependendo


da posio do nodo a ser removido na rvore, trs situaes podem ocorrer,
implicando em diferentes formas de fazer a remoo, analisadas a seguir.

Remoo de uma folha. Quando o nodo a ser removido for uma folha, ele
simplesmente liberado, bastando atualizar o campo de elo de seu ascendente
direto para o endereo nulo. A remoo de uma folha o caso mais simples,
pois no requer que a rvore seja reorganizada. A Figura 6.14 mostra uma
ABP e a remoo da folha de chave 60 desta rvore.

Remoo de nodo de derivao com somente uma subrvore. Para


que um nodo interno seja fisicamente removido necessrio que outro nodo
ocupe seu lugar na rvore, sempre respeitando a ordem numrica das chaves.
Caso o nodo a ser removido possua somente uma subrvore, isto pode ser feito
subindo de um nvel a raiz desta subrvore, de modo que ela ocupe a posio
que o nodo removido ocupava. Assim fica preservada a ordem das chaves da

50 50

40 90 40 90

35 60 100 35 100

Figura 6.14 Remoo de uma folha em uma ABP.


220 Estruturas de Dados

ABP. A Figura 6.15 mostra a remoo do nodo de derivao de chave 45, cuja
posio ser ocupada pela raiz de sua subrvore, de chave 20.

Remoo de nodo de derivao com duas subrvores. a situao


mais complexa, na qual a rvore necessita ser reestruturada. Duas estratgias
podem ser adotadas: (1) substituir o nodo a ser removido por aquele que
possua a maior chave da sua subrvore da esquerda; ou (2) substituir o nodo
por aquele que apresentar a menor chave da sua subrvore da direita. Uma
vez identificado o nodo que ir ocupar a posio daquele que ser removido,
dois casos podem ocorrer, analisados a seguir.

Caso 1. Se o nodo que ir substituir o removido for uma folha, feita sim-
plesmente a troca de sua posio na rvore. Exemplificando esta situao,
na Figura 6.16 removido o nodo de chave 40 e, em seu lugar, colocado o
nodo de chave 30, maior chave de sua subrvore da esquerda.

Caso 2. Se o nodo a ser colocado na posio do removido for um nodo de


derivao, a situao diferente. Por exemplo, na Figura 6.17, para remover
o nodo de chave 85, caso seja usada a opo de substitu-lo pelo nodo de
maior chave de sua subrvore da esquerda, este ser o nodo de chave 80. Se
o nodo 80 tivesse algum descendente direita, este teria necessariamente
uma chave maior do que o valor 80. Devido ordenao da ABP, o nodo que
vai ser utilizado na substituio sempre ter somente uma subrvore.

A substituio do nodo a ser removido da rvore pelo nodo encontrado deve


ser feita em dois passos: (1) inicialmente removido de sua posio o nodo
que vai ser utilizado na substituio (no exemplo, o nodo de chave 80), utili-
zando a operao vista no item anterior, ou seja, subindo um nvel a raiz de

50 50

45 85 20 85

20 90 10 30 90

10 30

Figura 6.15 Remoo de nodo de derivao com uma subrvore, em ABP.


Captulo 6 rvores Binrias 221

50 50

40 85 30 85

20 45 20 45

10 30 10

Figura 6.16 Remoo de nodo de derivao com duas subrvores, em ABP caso 1.

50 50

30 85 30 80

20 60 90 20 60 90

10 80 10 70

70

Figura 6.17 Remoo de nodo de derivao com duas subrvores, em ABP caso 2.

sua subrvore; (2) em seguida, este nodo encadeado de modo a ocupar a


posio do nodo a ser removido. A Figura 6.17 mostra esta operao: inicial-
mente o nodo de chave 80 substitudo pela raiz de sua subrvore, de chave
70, para depois ocupar a posio do nodo removido (85).

O algoritmo RemoverABP apresentado a seguir remove um nodo, identifica-


do por sua ChaveRem, de uma ABP. Supe-se que esta chave esteja presente
na rvore. utilizado um procedimento que chamado recursivamente at
encontrar o nodo buscado, sendo que a cada chamada passada a Raiz da
subrvore que deve ser percorrida na busca do nodo. Alm desses parme-
tros, o procedimento recebe ainda o endereo do antecessor da raiz de cada
subrvore analisada (Pai), para permitir acertar seu encadeamento quando o
222 Estruturas de Dados

nodo for removido. Na primeira chamada do procedimento deve ser forneci-


do o mesmo endereo para os trs parmetros Arv, Pai e Raiz. Se o nodo a
ser removido for a raiz da rvore, o tratamento diferenciado, o novo ende-
reo da raiz da rvore (Arv) deve ser devolvido ao programa de aplicao, no
sendo necessrio ajustar o encadeamento do antecessor do nodo removido.
Caso o nodo no seja encontrado na ABP, devolvido o endereo nulo.

Algoritmo 6.15 RemoverABP


Entradas: Arv, Pai, Raiz (TipoPtNodoABP)
ChaveRem (inteiro)
Sada: Arv (TipoPtNodoABP)
Varivel auxiliar: Anterior (TipoPtNodoABP)
incio
se Raiz nulo
ento se Raiz.Chave ChaveRem
ento se Raiz.Chave > ChaveRem
ento RemoverABP(Arv, Raiz, Raiz.Esq, ChaveRem)
seno RemoverABP(Arv, Raiz, Raiz.Dir, ChaveRem)
seno incio {VAI REMOVER O NODO DE ENDEREO RAIZ}
se (Raiz.Esq = nulo) e (Raiz.Dir = nulo)
ento {REMOVER FOLHA}
incio
se Raiz = Arv
ento Arv nulo
seno se Pai.Dir = Raiz
ento Pai.Dir nulo
seno Pai.Esq nulo
fim
seno se (Raiz.Esq = nulo) ou (Raiz.Dir = nulo)
ento {NODO TEM SOMENTE UMA SUBRVORE}
se Raiz.Esq = nulo
ento {SUBIR SUBRVORE DIREITA}
se Raiz Arv
ento se Pai.Esq = Raiz
ento Pai.Esq Raiz.Dir
seno Pai.Dir Raiz.Dir
seno Arv Raiz.Dir
seno {SUBIR SUBRVORE ESQUERDA}
se Raiz Arv
ento se Pai.Esq = Raiz
ento Pai.Esq Raiz.Esq
seno Pai.Dir Raiz.Esq
seno Arv Raiz.Esq
Captulo 6 rvores Binrias 223

seno {NODO TEM DUAS SUBRVORES}


incio
Nodo Raiz.Esq
Anterior Raiz
enquanto Nodo.Dir nulo
faa incio
Anterior Nodo
Nodo Nodo.Dir
fim
{NODO VAI SUBSTITUIR RAIZ}
se (Nodo.Esq = nulo)
ento Anterior.Dir nulo { UMA FOLHA}
seno Anterior.Dir Nodo.Esq
se Raiz Arv
ento se Pai.Esq = Raiz
ento Pai.Esq Nodo
seno Pai.Dir Nodo
seno Arv Nodo
Nodo.Esq Raiz.Esq
Nodo.Dir Raiz.Dir
fim
liberar(Raiz)
Raiz nulo
fim
fim

6.4.3 acesso a um nodo


Como j mencionado, as ABPs so estruturadas de maneira a tornar mais
rpida a busca a um determinado nodo, com base em sua chave. A busca de
uma determinada chave em uma ABP realizada da seguinte forma:

1 o valor procurado comparado com a chave do nodo-raiz. Se for igual,


cessa a busca;
2 caso o valor procurado seja maior do que a chave do nodo-raiz, toda a
subrvore esquerda eliminada da busca, sendo o processo de busca
repetido para a raiz da subrvore da direita;
3 caso o valor procurado seja menor do que a chave do nodo-raiz, a busca
segue na subrvore da esquerda.

A funo a seguir implementa esta busca, recebendo o endereo da raiz da


rvore (Arv) e o valor de chave a ser buscado (ChaveBuscada). A funo de-
224 Estruturas de Dados

volve o endereo do nodo que apresentar esta chave. Caso no seja encontra-
do algum nodo com esta chave, a funo retorna endereo nulo.

Algoritmo 6.16 BuscarABP (Funo)


Entradas: Arv (TipoPtNodoABP)
ChaveBuscada (inteiro)
Retorno: (TipoPtNodoABP)
Variveis auxiliares:
Achou (lgico)
PtNodo (TipoPtNodoABP)
incio
PtNodo Arv
Achou falso
enquanto (no Achou) e (PtNodo nulo)
faa se PtNodo.Chave = ChaveBuscada
ento Achou verdadeiro
seno se PtNodo.Chave > ChaveBuscada
ento PtNodo PtNodo.Esq
seno PtNodo PtNodo.Dir
BuscarABP PtNodo
fim

Outra forma de implementar esta mesma funo utilizando a natureza im-


plicitamente recursiva das rvores binrias, conforme mostrado na funo a
seguir.

Algoritmo 6.17 BuscarABPRec (Funo)


Entradas: Raiz (TipoPtNodoABP)
ChaveBuscada (inteiro)
Retorno: (TipoPtNodoABP)
incio
se Raiz = nulo
ento BuscarABPRec nulo
seno se Raiz.Chave = ChaveBuscada
ento BuscarABPRec Raiz
seno se Raiz.Chave > ChaveBuscada
ento BuscarABPRec BuscarABPRec(Raiz.Esq, ChaveBuscada)
seno BuscarABPRec BuscarABPRec(Raiz.Dir, ChaveBuscada)
fim
Captulo 6 rvores Binrias 225

6.5 rvores balanceadas


Considerando somente a operao de busca de informaes, o tempo de
execuo para encontrar uma informao depende diretamente da distn-
cia do nodo que contm esta informao at a raiz da rvore. rvores ba-
lanceadas tm por objetivo otimizar as operaes de consulta, diminuindo
o nmero mdio de comparaes efetuadas at que um determinado nodo
seja encontrado. Duas formas de balanceamento podem ser utilizadas:

balanceamento por altura, tambm denominado balanceamento uni-


forme, no qual todas as folhas ficam mesma distncia da raiz, ou a uma
distncia muito semelhante. A ABP mostrada na Figura 6.11 completa-
mente balanceada por altura;
balanceamento por freqncia, tambm denominado balanceamento
no uniforme, no qual a distribuio dos nodos leva em conta a freqn-
cia de acessos feitos a cada nodo, sendo aqueles mais acessados dispostos
mais prximos raiz da rvore.

Estes dois tipos de balanceamento sero analisados a seguir para rvores


binrias.

Raiz

13

24

27

56

Figura 6.18 ABP desbalanceada.


226 Estruturas de Dados

6.5.1 rvores balanceadas por altura AVL


No balanceamento por altura, somente a distncia do nodo at a raiz con-
siderada. Quanto mais balanceada for uma rvore, mais rapidamente sero
acessados todos os seus nodos. Uma ABP (Seo 6.4) construda por uma
aplicao atravs de sucessivas inseres de novos nodos, pode resultar muito
desbalanceada por altura, levando a buscas nada eficientes das informaes.
Por exemplo, a Figura 6.18 mostra a ABP resultante da insero de nodos
quando as chaves so fornecidas na seguinte ordem: 1 13 24 27 56.

Exigir que uma rvore seja completamente balanceada por altura restringe
a possibilidade de sua utilizao porque apresenta uma manuteno muito
dispendiosa, exigindo reorganizaes freqentes para correes dos desvios
na estrutura da rvore. Pode-se definir um grau de balanceamento para ga-
rantir uma determinada eficincia nas buscas, ou seja, um fator que limita
o mximo desbalanceamento que a rvore pode apresentar deixando a ma-
nuteno da estrutura da rvore menos onerosa. rvores que apresentam
esta caracterstica so denominadas rvores altamente balanceadas com
fator de balanceamento FB(k), ou k-balanceadas. Uma rvore possui
FB(k) se, para qualquer nodo, as alturas de suas subrvores no diferem por
mais de k unidades. Assim, rvores FB(1) so aquelas para as quais as alturas
das subrvores de qualquer nodo no diferem de mais de uma unidade; nas
rvores FB(2), as alturas das subrvores variam no mximo de duas unida-
des; e assim por diante.

130 1 120 1

1 100 150 1 0 100 130 2

0 80 1 120 200 0 0 80 0 110 200 1

0 110 0 150

(a) FB(1) (b) FB(2)

Figura 6.19 ABP com fator de balanceamento FB(k) representado em cada nodo.
Captulo 6 rvores Binrias 227

Para garantir o balanceamento desejado de uma rvore, deve-se calcular o FB


para todos os seus nodos a cada insero ou remoo realizada. Nos algorit-
mos mostrados a seguir utilizada a seguinte frmula para calcular este fator:

FB = (altura subrvore direita) menos (altura subrvore esquerda)


A ordem escolhida entre as subrvores (aqui direita menos a esquerda) no
relevante, mas dever ser a mesma em toda a aplicao. Um exemplo de
rvore FB(1) apresentado na figura 6.19a, e de uma rvore FB(2) na figura
6.19b. Junto a cada nodo mostrado o seu FB. Nota-se que em alguns nodos
o FB fica negativo, devido ordem em que calculado. Por exemplo, na rvo-
re (a) desta figura, o FB da raiz (nodo 130) 1, pois a altura da subrvore
direita 2 (distncia entre os nodos 130 e 200), e da esquerda 3 (distncia
entre os nodos 130 e 110). A informao representada, na realidade, consiste
no mdulo do FB, no sendo considerado o sinal negativo. O FB da rvore
toda ser o maior valor, em mdulo, encontrado em algum nodo.

rvores AVL. ABPs que apresentam FB(1) para balanceamento por altura
so conhecidas como rvores AVL. Isto significa que, em todo nodo, a dife-
rena entre as alturas de suas subrvores no excede a uma unidade O nome
AVL vem de Adelson-Velskii e Landis, que introduziram, em 1962, uma estru-
tura de rvore binria balanceada com respeito s alturas das subrvores.

bom lembrar que a rvore deixa de ser AVL caso em algum de seus nodos
no se verificar a propriedade FB(1). Aplicaes que utilizem rvores AVL
devero tomar muito cuidado no momento de inserir ou remover nodos, para
que o balanceamento por altura no seja perdido.

Muitas vezes necessrio reestruturar a rvore para manter seu balancea-


mento. Toda vez que for efetuada uma operao de insero de um novo
nodo em uma rvore AVL, ou que seja removido um nodo, deve ser feita
uma verificao de toda a rvore, recalculando os fatores de balancea-
mento de cada nodo. Costuma-se incluir em cada nodo da rvore AVL um
campo que indica o seu fator de balanceamento, para tornar mais eficien-
te este processo de verificao aps uma insero ou remoo. Caso em
algum nodo seja detectado um fator diferente de |1| (valor em mdulo,
sem considerar eventuais sinais negativos), a rvore deve ser reestruturada
para que volte a ser uma rvore AVL. Ao reestruturar uma rvore AVL
importante que seja preservada a ordem das chaves, utilizada para a busca
de informaes.
228 Estruturas de Dados

operaes de rotao
A reestruturao de uma rvore AVL feita atravs de uma operao de
rotao em torno do nodo onde foi constatado o fator FB maior do que
uma unidade (valor absoluto). A seguir so analisadas quatro operaes de
rotao, denominadas simples esquerda, simples direita, dupla esquer-
da e dupla direita. Nos algoritmos relativos a estas operaes utilizado o
seguinte tipo de nodo:

TipoPtNodoAVL = TipoNodoAVL
TipoNodoAVL = registro
FB: inteiro {fator de balanceamento do nodo}
Chave: inteiro
Info: TipoInfo
Esq, Dir: TipoPtNodoAVL
fim registro

rotao simples direita


A reestruturao de uma rvore AVL deve ser feita atravs deste tipo de rota-
o sempre que:

o nodo desbalanceado apresentar fator negativo;


a raiz da subrvore da esquerda deste nodo tambm apresentar fator ne-
gativo.

A Figura 6.20 mostra como efetuada esta rotao. Nesta figura, T1, T2 e T3
so subrvores binrias, vazias ou no; o nodo P representa o nodo que apre-
sentou fator maior do que |1|, raiz desta rotao, e o nodo U, a raiz de sua
subrvore da esquerda. A rotao simples direita consiste em uma rotao
de U sobre P, sendo feita da seguinte maneira:

P U

U T1 P
T3

T1 T2 T2 T3

Figura 6.20 Rotao simples direita em rvore AVL.


Captulo 6 rvores Binrias 229

o nodo U vai ocupar a posio antes ocupada pelo nodo P;


o nodo P passa a ser o descendente da direita do nodo U;
a subrvore da direita do nodo P passa a ser a subrvore da esquerda do
nodo U.

A Figura 6.21 apresenta um exemplo de rotao simples direita. A insero


de um novo nodo, com chave 4, na rvore AVL original (a) fez com que o
nodo de chave 42 passasse a apresentar fator 2 (b). A rotao direita em
torno do nodo de chave 42 faz com que a rvore volte a ser AVL (c).

O algoritmo a seguir executa a rotao direita, recebendo o endereo do


nodo para o qual foi detectado o fator maior do que |1| (Pt), e devolvendo
o endereo do nodo que ocupa o seu lugar depois da rotao.

Algoritmo 6.18 RotaoDireitaAVL


Entrada: Pt (TipoPtNodoAVL)
Retorno: Pt (TipoPtNodoAVL)
Varivel auxiliar: Ptu (TipoPtNodoAVL)
incio
Ptu Pt.Esq
Pt.Esq Ptu.Dir

42 1 15 0

0 15 88 0 1 6 42 0

0 6 27 0 0 4 0 27 88 0

(a) 42 2 (c)

r4 1 Ro
lui
15 88 0 ta
c
In o
1 6 27 0

0 4 (b)

Figura 6.21 Exemplo de rotao simples direita.


230 Estruturas de Dados

Ptu.Dir Pt
Pt.FB 0
Pt Ptu
fim

rotao simples esquerda


Este tipo de rotao deve ser utilizado sempre que:

o nodo desbalanceado apresentar fator positivo;


a raiz da subrvore da esquerda deste nodo tambm apresentar fator positivo.

A rotao simples esquerda mostrada na Figura 6.22, onde o nodo P re-


presenta o nodo que apresentou fator maior do que |1|, raiz desta rotao,
e o nodo Z, a raiz de sua subrvore da direita. A rotao simples esquerda
consiste em uma rotao de Z sobre P, sendo feita da seguinte maneira:

o nodo Z vai ocupar a posio antes ocupada pelo nodo P;


o nodo P passa a ser o descendente da esquerda do nodo Z;
a subrvore da esquerda do nodo Z passa a ser a subrvore da direita do
nodo P.

A Figura 6.23 apresenta um exemplo de rotao simples esquerda. A in-


sero de um novo nodo, com chave 90, na rvore AVL original (a) fez com
que o nodo de chave 42 passasse a apresentar fator 2 (b). Aps a rotao
esquerda este nodo passa a apresentar fator 0, e a rvore volta a ser AVL (c).

Z
P

P T3
T1 Z

T3 T1 T2
T2

Figura 6.22 Rotao simples esquerda.


Captulo 6 rvores Binrias 231

42 +1 88 0

0 15 88 0 0 42 94 1

0 67 94 0 0 15 67 0 90 0

(a) 42 +2
(c)

0
i r9 0 15 88 +1

Ro
clu

ta
In


o
0 67 94 1

0 90
(b)

Figura 6.23 Exemplo de rotao simples esquerda.

O algoritmo a seguir executa a rotao esquerda, recebendo o endereo do


nodo para o qual foi detectado o fator maior do que |1| (Pt), e devolvendo
o endereo do nodo que ocupa o seu lugar depois da rotao.

Algoritmo 6.19 RotaoEsquerdaAVL


Entrada: Pt (TipoPtNodoAVL)
Retorno: Pt (TipoPtNodoAVL)
Varivel auxiliar: Ptu (TipoPtNodoAVL)
incio
Ptu Pt.Dir
Pt.Dir Ptu.Esq
Ptu.Esq Pt
Pt.FB 0
Pt Ptu
fim

rotao dupla direita


A reestruturao de uma rvore AVL deve ser feita atravs deste tipo de rota-
o sempre que:
232 Estruturas de Dados

um nodo apresentar fator negativo;


a raiz da subrvore da esquerda deste nodo apresentar fator positivo.

Esta forma de rotao mostrada na Figura 6.24, onde o nodo P representa


o nodo que apresentou fator maior do que 1; seu descendente esquerda
o nodo U; e o descendente direita de U o nodo V. A operao composta
por duas rotaes, executadas em seqncia uma da outra: inicia por uma
rotao simples esquerda, seguida de uma rotao simples direita.

A Figura 6.25 resume a operao de rotao dupla direita, que consiste de


uma rotao de V sobre P e depois sobre V, sendo feita da seguinte maneira:

o nodo V vai ocupar a posio antes ocupada pelo nodo P;


o nodo U passa a ser o descendente da esquerda do nodo V;
o nodo P passa a ser o descendente da direita do nodo V;
a subrvore da esquerda do nodo V passa a ser a subrvore da direita do
nodo U;
a subrvore da direita do nodo V passa a ser a subrvore da esquerda do
nodo P.

P P

Rotao V
U Esquerda T4
T4

U T3
T1 V

T1 T2
T2 T3
V o

ta ta
Ro irei
D

U P

T1 T2 T3 T4

Figura 6.24 Rotao dupla direita seqncia de rotaes.


Captulo 6 rvores Binrias 233

P V

U T4 U P

T1 V T1 T2 T3 T4

T2 T3

Figura 6.25 Rotao dupla direita.

Um exemplo de rotao dupla direita apresentado na Figura 6.26. A inser-


o de um novo nodo, com chave 100, na rvore AVL original (a) fez com que
o nodo de chave 110 passe a apresentar fator 2 (b). A rotao dupla direita
faz com que a rvore volte a ser AVL (c).

O algoritmo a seguir executa a rotao dupla direita. Ele recebe o endereo


do nodo para o qual foi detectado o fator maior do que |1|, e devolve o en-
dereo do nodo que ocupa o seu lugar depois da rotao.

120 0 120 0

1 110 150 0 0 100 150 0

0 80 130 0 200 0 0 80 0 110 130 0 200 0

(a) 120 1 (c)

00 2 110 150 0 Ro
r1
c lui ta

In o
+1 80 130 0 200 0

100 0 (b)

Figura 6.26 Exemplo de rotao dupla direita.


234 Estruturas de Dados

Algoritmo 6.20 RotaoDuplaDireitaAVL


Entrada: Pt (TipoPtNodoAVL)
Retorno: Pt (TipoPtNodoAVL)
Variveis auxiliares:
Ptu, Ptv (TipoPtNodoAVL)
incio
Ptu Pt.Esq
Ptv Ptu.Dir
Ptu.Dir Ptv.Esq
Ptv.Esq Ptu
Pt.Esq Ptv.Dir
Ptv.Dir Pt
se Ptv.FB = 1
ento Pt.FB 1
seno Pt.FB 0
se Ptv.FB = 1
ento Ptu.FB 1
seno Ptu.FB 0
Pt Ptv
fim

rotao dupla esquerda


A rotao dupla esquerda empregada quando a rvore AVL apresentar:

um nodo com fator positivo;


a raiz da subrvore da direita deste nodo com fator negativo.

Esta forma de rotao mostrada na Figura 6.27, onde o nodo P representa


o nodo que apresentou fator maior do que |1|; seu descendente direita o
nodo Z; e o descendente esquerda de Z o nodo Y. Como no caso anterior,
esta operao composta por duas rotaes executadas em seqncia uma
da outra: inicia por uma rotao simples direita, e seguida de uma rotao
simples esquerda.

A Figura 6.28 mostra o resultado da operao de rotao dupla esquerda,


que consiste de uma rotao de Y sobre P e depois sobre Z, sendo executada
da seguinte maneira:

o nodo Y vai ocupar a posio antes ocupada pelo nodo P;


o nodo P passa a ser o descendente da esquerda do nodo Y;
o nodo Z passa a ser o descendente da direita do nodo Y;
Captulo 6 rvores Binrias 235

P P

Rotao
T1 Z Direita
T1 Y

Y T4 T2 Z

T2 T3 T2 T3
Y

o
a
P Z ta rd
Ro que
E s

T1 T2 T3 T4

Figura 6.27 Rotao dupla esquerda seqncia de rotaes.

P Y

T1 Z P Z

Y T4 T1 T2 T3 T4

T2 T3

Figura 6.28 Rotao dupla esquerda.

a subrvore da esquerda do nodo Y passa a ser a subrvore da direita do


nodo P;
a subrvore da direita do nodo Y passa a ser a subrvore da esquerda do
nodo Z.

A Figura 6.29 apresenta um exemplo de rotao dupla esquerda. A insero


de um novo nodo, com chave 150, na rvore AVL original (a) fez com que o
236 Estruturas de Dados

120 0 120 0

0 100 130 +1 0 100 0


150

0 0
0 80 0 110 0 200 0 0 80 110 130 200 0

(a) 120 +1
(c)

0 0 100 130 +2
15
ir

Ro
clu
In

ta

o
80 0 110 0 200 1

150 0
(b)

Figura 6.29 Exemplo de rotao dupla esquerda.

nodo de chave 130 passe a apresentar fator 2 (b). A rotao dupla direita
faz com que a rvore volte a ser AVL (c).

O algoritmo a seguir executa a rotao dupla esquerda. Ele recebe o ende-


reo do nodo para o qual foi detectado o fator maior do que |1|, e devolve o
endereo do nodo que ocupa o seu lugar depois da rotao.

Algoritmo 6.21 RotaoDuplaEsquerdaAVL


Entrada: Pt (TipoPtNodoAVL)
Retorno: Pt (TipoPtNodoAVL)
Variveis auxiliares:
Pty, Ptz (TipoPtNodoAVL)
incio
Ptz Pt.Dir
Pty Ptz.Esq
Ptz.Esq Pty.Dir
Pty.Dir Ptz
Pt.Dir Pty.Esq
Pty.Esq Pt
se Pty.FB = 1
ento Pt.FB 1
seno Pt.FB 0
Captulo 6 rvores Binrias 237

se Pty.FB = 1
ento Ptz.FB 1
seno Ptz.FB 0
Pt Ptv
fim

insero de um novo nodo


Com base no que foi visto anteriormente, podemos agora definir um algo-
ritmo para inserir um novo nodo em uma rvore AVL. Devem ser fornecidos,
alm do endereo do nodo-raiz da rvore (A), a chave do novo nodo (Va-
lorChave) e o campo de informao que o nodo deve apresentar (Dado). O
algoritmo InserirAVL, apresentado a seguir, insere o novo nodo na posio
definida pela chave fornecida, sempre como uma folha. Em seguida, ele veri-
fica o fator de balanceamento dos nodos antecessores, e efetua as rotaes
necessrias para que a rvore continue sendo AVL. Os algoritmos Balancea-
rEsq e BalancearDir, utilizados no balanceamento, no so aqui apresenta-
dos, ficando como exerccios sugeridos. O parmetro OK informa se a insero
foi realizada com sucesso.

O algoritmo no analisa se a chave j existe na rvore, como foi feito no caso


da ABP. Ele inicia procurando a localizao em que o nodo deve ser inserido.
Caso nesta pesquisa seja encontrado um nodo que j possua a chave do novo
nodo, o procedimento interrompido sem que a insero seja realizada. Di-
ferentemente do que feito para ABP, aqui o novo nodo somente alocado
quando for encontrada sua posio.

Algoritmo 6.22 InserirAVL


Entradas: A (TipoPtNodoAVL)
ValorChave (inteiro)
Dado (TipoInfo)
OK (lgico)
Retorno: A (TipoPtNodoAVL)
incio
se A = nulo
ento incio {INSERO }
alocar(A)
A.Esq A.Dir nulo
A.Chave ValorChave
A.Info Dado
A.FB 0
OK verdadeiro
238 Estruturas de Dados

fim
seno incio
se ValorChave = A.Chave
ento OK falso
seno se ValorChave < A.Chave
ento incio
InserirAVL(A.Esq, ValorChave, Dado, OK)
se OK
ento caso A.FB seja
1: A.FB 0
0: A.FB 1
1: BalancearEsq(A)
fim caso
fim
seno incio
InserirAVL(A.Dir, ValorChave, Dado, OK)
se OK
ento caso A.FB seja
1: A.FB 0
0: A.FB 1
1: BalancearDir(A, OK)
fim caso
fim
fim
fim

6.5.2 rvores balanceadas por freqncia


Uma rvore binria organizada por freqncia tem por objetivo agilizar
as consultas com base no conhecimento do nmero de acesso aos nodos.
Para isso necessrio armazenar, ao longo da aplicao, o nmero de aces-
sos que foram feitos a cada nodo. De posse desta informao, a rvore
organizada de modo que as informaes acessadas mais freqentemente
sejam colocadas mais prximas raiz, permitindo que sua recuperao seja
mais rpida.

Como exemplo de rvore balanceada por freqncia, vamos analisar um tipo


de rvore binria que apresenta as seguintes caractersticas:

as informaes esto somente nas folhas;


existe em cada folha uma informao adicional (wi) que informa a freqncia
de acesso a esta folha (ndice de acesso).
Captulo 6 rvores Binrias 239

Denominando o comprimento do caminho de uma folha at a raiz de li, para


que seja balanceada por freqncia, uma rvore de m folhas deve apresentar
o caminho ponderado mnimo, sendo este definido pelo valor mnimo obtido
para o somatrio abaixo:

A Figura 6.30 apresenta duas formas de organizar quatro informaes em


uma rvore binria deste tipo, ou seja, colocando as informaes somente
nas folhas. conhecido o ndice de freqncia de acesso a cada uma destas
informaes, representado na figura pelos valores 2, 3, 4 e 11 o valor com
ndice de acesso 11 o mais acessado, e aquele que tem o ndice de acesso
2 o que apresenta menos acessos na aplicao. Abaixo de cada rvore
apresentada a forma de calcular o somatrio acima. Vemos que a rvore da
esquerda apresenta um valor bem menor para este somatrio. Podemos ob-
servar tambm que na rvore da esquerda, o valor 11, que representa a folha
mais acessada, est a apenas um nvel da raiz, enquanto os nodos que apre-
sentam os menores valores (2 e 3) esto a trs nveis de distncia.

A construo de uma rvore binria com caminho ponderado mnimo pode


ser feita atravs do Algoritmo de Huffman, apresentado a seguir, em passos

11 2

4 3

2 3 4 11

4 x 2 + 2 x 3 + 3 x 3 + 11 x 1 = 34 3 x 2 + 4 x 3 + 11 x 3 + 2 x 1 = 53

ndices de freqncia de acesso: 2 , 3 , 4 , 11

Figura 6.30 Caminho ponderado mnimo em rvores binrias.


240 Estruturas de Dados

gerais. Atravs deste algoritmo a rvore construda a partir de suas folhas,


onde esto as informaes.

Algoritmo de Huffman
1. Construir um nodo para cada informao, associando a esta infor-
mao sua freqncia de acesso.
2. Procurar os dois menores valores contidos no conjunto de freqn-
cias de acesso a cada informao.
3. Substituir estes dois valores pela sua soma, formando um novo
nodo com este valor, e sendo este nodo a raiz dos dois valores
anteriormente encontrados.
4. Repetir os passos 2 e 3 at que o conjunto de freqncias de
acesso seja reduzido a um s valor.

Na Figura 6.31 apresentado um exemplo de construo de uma rvore bi-


nria com caminho ponderado mnimo, atravs desse algoritmo.

2 3 5 7 9 17 19

5 16 36

10

26

62

Figura 6.31 Construo de rvore com caminho ponderado mnimo pelo algorit-
mo de Huffman.
Captulo 6 rvores Binrias 241

5.6 exerccios
exerccios com rvores binrias
exerccio 1 Considere a rvore binria da figura 6.2, armazenada por nveis
em um arranjo. Implemente algoritmos para:

inserir um novo nodo como descendente esquerda do nodo cujo campo


de informao for igual a um valor passado como parmetro;
listar os campos de informao dos nodos-folha;
remover todos os nodos descendentes direita, com seus descendentes.

exerccio 2 Repita o exerccio anterior, considerando que a rvore binria foi


representada em profundidade.

exerccio 3 Construa um algoritmo para transformar uma rvore n-ria, im-


plementada por encadeamento, em uma rvore binria equivalente. Defina
um formato para o nodo e limite em cinco o nmero de descendentes que
cada nodo pode ter. Teste o algoritmo transformando a rvore do Exerccio 16
do captulo anterior em uma rvore binria equivalente.

exerccio 4 Construa o algoritmo inverso ao do exerccio anterior: dada a


rvore binria, o algoritmo deve construir a rvore n-ria equivalente. Utilize
o mesmo formato para o nodo desta ltima.

exerccio 5 O Algoritmo 6.6 apresenta a funo LOCALIZAR que utiliza uma


pilha para guardar informaes durante a busca que realiza na rvore. O
algoritmo apresentado implementa esta pilha sobre um arranjo (alocao
seqencial). Reescreva esta funo implementando a pilha atravs de en-
cadeamento.

exerccio 6 O Algoritmo 6.7 (PS-FIXADOESQ) percorre uma rvore binria


atravs de caminhamento ps-fixado esquerda. Pede-se:

modifique este algoritmo para que realize o percurso da rvore atravs de


caminhamento central direita;
implemente o algoritmo, escolhendo uma forma de marcar as informa-
es inseridas na pilha, e optando por implementar a pilha ou atravs de
encadeamento, ou por contigidade fsica.
242 Estruturas de Dados

exerccio 7 Na Seo 6.3.1 mostrado como pode ser construda uma r-


vore, sendo fornecidos os valores de acordo com o caminhamento prefixado.
Construa um algoritmo para construir uma rvore binria por nveis, ou seja,
primeiro seria fornecido o valor para a raiz, depois os valores dos dois filhos
da raiz e assim por diante. Neste caso, a natureza recursiva da rvore no
poder ser utilizada.

exerccio 8 Construa um algoritmo que faa uma cpia de uma rvore exis-
tente. O algoritmo dever receber o endereo da raiz da rvore original, e
devolver o endereo da raiz da rvore gerada. Caso receba um endereo nulo,
deve devolver um endereo nulo, indicando que, como no havia rvore para
copiar, nenhuma rvore nova foi gerada.

exerccio 9 Construa uma funo recursiva IGUAIS (Arv1, Arv2), para deter-
minar se as duas rvores binrias Arv1 e Arv2 so iguais, tanto em estrutura
como em contedo de seus nodos. A funo deve retornar verdadeira caso as
rvores sejam iguais, e falsa, caso contrrio.

exerccio 10 Construa um algoritmo que insere um novo nodo em uma


rvore binria no-ordenada, como descendente de um determinado nodo
identificado por seu campo de informao.

exerccio 11 Implemente um procedimento que insira um novo nodo em


uma rvore binria ordenada, devendo este ser a folha mais esquerda da
rvore.

exerccio 12 Na Seo 6.2.2 apresentada uma funo que insere um des-


cendente esquerda de um nodo identificado pelo seu contedo. Adapte
esta funo para inserir um descendente direita.

exerccio 13 Seja uma rvore binria A onde cada nodo possui, alm dos
ponteiros para os nodos-filhos, um campo denominado Info, contendo a
identificao do nodo. Especifique um programa que percorra essa rvore
binria e escreva, ao percorr-la, a identificao do nodo visitado e de seu
nodo-pai. Identifique o tipo de caminhamento que voc escolheu para per-
correr a rvore.

exerccio 14 Escreva um algoritmo que recebe, como parmetro, o do en-


dereo da raiz de uma rvore binria e um valor que identifique um nodo, e
Captulo 6 rvores Binrias 243

que imprime o contedo dos campos de informao deste nodo e dos seus
descendentes diretos (filhos).

exerccio 15 Considere a existncia de duas rvores binrias, cujos endere-


os das razes esto nos ponteiros a1 e a2. Diz-se que a1 a2 quando a1
equivalente a a1 ou quando existe pelo menos uma subrvore de a2 que seja
equivalente a a1. Escreva uma funo ou procedimento que testa se uma
rvore binria a1 est contida em outra rvore binria a2.

exerccio 16 Tendo como entrada uma rvore binria (Arv) e um valor (V),
escreva um algoritmo que localize esse valor na rvore. Se encontrado, calcule
o nmero de nodos das subrvores de V, recursivamente para cada subrvore
a partir de V. Identifique o tipo de caminhamento que voc escolheu para
percorrer a rvore.

exerccio 17 Dada uma rvore binria, construa uma funo que informe se
nesta rvore existem nodos com informaes duplicadas (iguais).

exerccio 18 Construa um algoritmo que, dada uma lista encadeada, monte


uma rvore com as informaes contidas nesta lista. Identifique em que cami-
nhamento esta rvore deve ser percorrida para que os nodos sejam acessados
na mesma ordem em que esto na lista inicial.

exerccios com rvores binrias de pesquisa (ABP)


exerccio 19 Escreva uma funo recursiva que receba uma rvore e veri-
fique se ela ou no uma ABP, retornando Verdadeiro (1) ou Falso (0)
conforme o caso.

exerccio 20 Dadas duas ABPs A e B, desenvolva um algoritmo recursivo que


retorne a ABP C, que representa a unio entre A e B.

exerccio 21 Dadas duas ABPs A e B, desenvolva um algoritmo recursivo que


retorne a ABP C, que representa a interseco entre A e B.

exerccio 22 Considere uma ABP cujos nodos apresentam a estrutura utiliza-


da na seo 6.4. O endereo da raiz desta rvore est na varivel-apontador
RAIZ. Escreva um algoritmo que recebe RAIZ e imprime o campo de informa-
o das folhas da rvore, em ordem decrescente de valores de chaves.
244 Estruturas de Dados

exerccio 23 Considerando a ABP apresentada na Figura 6.11, procure iden-


tificar a existncia ou no de ordem (e caso exista, qual) para esta mesma
rvore, caso seja percorrida com caminhamento (1) central direita, e (2)
prefixado esquerda.

exerccio 24 Suponha uma srie de dados organizados em uma ABP.


Escreva:

a funo SomaNodos(Chave) para determinar quantos nodos tm chave


superior fornecida;
o algoritmo ExcluiABPFolha que exclui um nodo da rvore, mas so-
mente se este for uma folha.

exerccio 25 Dada uma ABP, construa um algoritmo que gere uma lista du-
plamente encadeada (no circular) com os dados contidos no campo de in-
formao da rvore, respeitando a ordem crescente dos valores contidos nos
seus nodos.

exerccio 26 Dada uma lista encadeada, monte uma ABP com os valores
contidos nos nodos da lista.

exerccios com rvores balanceadas e AVL


exerccio 27 Verifique se as rvores 2-balanceadas, ou seja, que apresentam
FB(2), so rvores AVL.

exerccio 28 Desenvolva um algoritmo para inserir nodos em uma rvore


2-balanceada.

exerccio 29 Um certo professor Amongus afirma que a ordem pela qual


um conjunto fixo de elementos inserido em uma rvore AVL no importa
ir resultar sempre na mesma rvore AVL. O professor Amongus est correto?
Justifique sua resposta atravs de um pequeno exemplo que prove se o pro-
fessor Amongus est certo ou errado.

exerccio 30 Reescreva os algoritmos vistos para rotaes da Seo 6.5.1.1.,


considerando que a diferena entre as alturas calculada diminuindo a altura
da subrvore da direita da altura da rvore da esquerda (contrrio do apre-
sentado no texto).
Captulo 6 rvores Binrias 245

exerccio 31 Construa os algoritmos BalancearEsq e BalancearDir utili-


zados no Algoritmo 6.22.

exerccio 32 Escreva um algoritmo que verifica se uma determinada rvore


binria ou no AVL.

exerccio 33 Construa um algoritmo para remover uma folha de uma rvore


AVL, cuidando para que ela continue sendo AVL.

exerccio 34 Construir (fazer o desenho) uma rvore binria com compri-


mento de caminho ponderado mnimo, utilizando o algoritmo de Huffman.
Os valores contidos nas folhas desta rvore devem ser os seguintes:

3 5 7 11 14 24 29 35

exerccios de aplicaes
exerccio 35 Considere as informaes relativas aos medicamentos de uma
farmcia organizadas em uma rvore binria. O endereo da raiz desta rvore
FARM, e os nodos apresentam dois campos de informao, alm dos ende-
reos de seus dois descendentes:

TipoNodo = registro
Nome: string;
Preo: real;
Esq, Dir: TipoPtNodo
fim registro

Construa, com e sem recursividade, os seguintes algoritmos:

um algoritmo para imprimir todos os nomes de todos os medicamentos


da farmcia, percorrendo a rvore em caminhamento central direita;
uma funo para devolver o Preo de um medicamento cujo Nome pas-
sado como parmetro. Caso no encontre este nome em algum nodo da
rvore, a funo deve devolver o valor zero.

exerccio 36 Considere as informaes relativas aos produtos de uma loja


organizadas em uma rvore binria cujos nodos apresentam os seguintes
campos: ESQ (ponteiro para o descendente da esquerda), COD (inteiro), NOME
(string), VALOR (valor numrico real) e DIR (ponteiro para o descendente da
246 Estruturas de Dados

direita). O endereo da raiz desta rvore est na varivel PROD. Para esta r-
vore, construa:

uma funo que conte quantos produtos tem VALOR superior a um valor
N passado como parmetro;
um algoritmo que liste os cdigos e os valores de todos os produtos da
rvore;
uma funo que informe o cdigo e o valor de um produto identificado
por seu cdigo;
um algoritmo que altere o campo VALOR do determinado produto para
um novo valor fornecido como parmetro. O produto a ser modificado
identificado pelo seu campo COD, tambm passado como parmetro.

exerccio 37 Considere que uma empresa organize suas vendas em uma


rvore binria cujos nodos so formados por:

NOME CDIGO DATA PRODUTO VALOR ESQ DIR

A raiz da rvore est no ponteiro RAIZ. Escreva algoritmos para:

percorrer a rvore e somar o total de vendas da empresa, ou seja, somar


todos os campos VALOR;
listar os dados dos nodos de datas posteriores a 01/01/2007;
eliminar o nodo relativo a um determinado cdigo COD. Para evitar a re-
organizao da rvore, substitua o cdigo por um valor que indique que o
nodo est livre. Tome cuidado para zerar o valor contido no campo VALOR;
inserir um novo produto na rvore. Para isto, inicialmente percorra a r-
vore verificando se existe algum nodo alocado e no utilizado (resultante
da remoo de algum produto). Caso no seja encontrado um nodo livre,
aloque o novo nodo como uma folha.

exerccio 38 Uma expresso aritmtica em notao polonesa definida


recursivamente da seguinte maneira: Uma expresso, em notao polo-
nesa, consiste em um operando ou, ento, em um operador seguido por
duas expresses em notao polonesa. Considerando esta definio, toda
expresso aritmtica pode ser escrita de forma no ambgua em notao
polonesa, dispensando-se o uso de parnteses. Escreva um algoritmo para
transformar uma dada expresso aritmtica na sua correspondente em no-
tao polonesa.
Captulo 6 rvores Binrias 247

exerccio 39 Dada uma rvore binria que representa uma expresso arit-
mtica, considerando apenas operaes binrias, gerar a mesma expresso
em notao completamente parentizada.

exerccio 40 Considere a rvore binria abaixo:


raiz da rvore

COCA

GUARAN ICETEA

SUKITA MINERAL
PEPSI

TNICA
TEEM

Implemente esta rvore usando ponteiros. Alm do nome de um refrigerante,


cada nodo tem seu preo de venda e o nmero de unidades em estoque. Em
seguida, implemente algoritmos para executar as seguintes operaes:

imprimir todos os dados da rvore, usando cada um dos caminhamentos.


Teste com e sem recursividade;
alterar o preo de um refrigerante cujo nome passado como parmetro.
O novo valor tambm deve ser passado como parmetro;
informar quantos refrigerantes tem mais de 20 unidades;
informar os descendentes (todos) de um determinado refrigerante (nome
passado como parmetro);
informar qual o nodo pai de um determinado nodo da rvore (com exce-
o da raiz).

exerccio 41 Implemente uma aplicao para identificar os erros ortogrfi-


cos mais freqentes em um dado texto. Devem ser fornecidos:

arquivo texto referente ao dicionrio;


arquivo texto referente ao texto a ser analisado;
uma constante K que indicar os erros mais freqentes.
248 Estruturas de Dados

A aplicao dever listar os k erros mais freqentes, por ordem decrescente


de freqncia e, dentro desta, por ordem lexicogrfica. A listagem dever ter
o seguinte formato (exemplo com K=4):

Nmero (K) Erro Freqncia Ocorre nas linhas

1 Alunso 10 1030505578-92*-100*-125
2 Uiversidade 7 9-10*-88*-200
3 Anoo 5 2-30*-95-160
4 Imformtica 5 10-55-80-100-120

O smbolo *, aps um nmero de linha, indica que existe mais do que uma
ocorrncia do erro nessa linha.

exerccio 42 Uma lista encadeada armazena a quantidade de unidades de


cada produto disponveis em uma loja. Cada nodo da lista constitudo de
NOME (nome do produto), COD (cdigo do produto) e NR (nmero de itens
disponveis para venda) e ELO (campo de elo para o prximo nodo da lista). O
endereo da lista est na varivel-apontador LISTA. Os nodos no apresen-
tam ordenao. Pede-se:

construa um algoritmo que organize as informaes desta lista em uma


ABP, ordenada de acordo com o campo COD. O procedimento dever ter
dois parmetros: o ponteiro LISTA e um segundo ponteiro ARVORE, onde
ser devolvido o endereo da raiz da rvore. A lista original no dever ser
destruda nem modificada;
construa uma funo que devolva o nmero de itens disponveis de um
determinado produto, buscando-o na ABP;
compare a eficincia dos procedimentos de consulta nas duas estruturas
na lista e na rvore.
anexo

pseudolinguagem utilizada neste texto


Na apresentao dos algoritmos ao longo deste texto utilizada uma pseu-
dolinguagem baseada no paradigma procedimental de programao. As
construes desta pseudolinguagem podem ser facilmente identificadas nas
linguagens de programao usuais, como PASCAL e C. A seguir, so apresen-
tadas resumidamente as construes da pseudolinguagem utilizada.

Estrutura bsica de um algoritmo. Todo algoritmo tem um nome. Para


permitir a identificao dos algoritmos a partir da Lista de Algoritmos,
procurou-se dar a eles nomes que dem uma indicao de sua finalidade.
Alm disso, a Lista de Algoritmos traz uma breve descrio da finalidade de
cada um.

Logo abaixo do nome do algoritmo so listados seus parmetros de entrada


(valores que ele deve receber para poder executar as aes requeridas), os
parmetros de sada (atravs dos quais os valores calculados so devolvidos
ao programa de aplicao) e as variveis locais necessrias execuo. A cada
parmetro e varivel definido associado um tipo de dado.

Em seguida so apresentados os comandos que compem cada algoritmo,


delimitados pelas palavras reservadas incio e fim. A separao entre co-
mandos definida pelo contexto e pela indentao utilizada na apresentao
dos algoritmos.

Para efeitos de padronizao do texto, os nomes dos algoritmos, de todas as


variveis e dos tipos de dados definidos iniciam sempre com letra maiscula.
As palavras reservadas so representadas em letra minscula.
250 Anexo

Tipos de dados. Os tipos de dados primitivos, usuais em linguagens de


programao, so utilizados diretamente nos algoritmos (inteiro, real,
caractere, string, lgico). A indicao do tipo de dado feita logo aps
o nome do parmetro ou varivel local correspondente, entre parntesis. A
utilizao de ponteiros detalhada mais adiante.

Os valores das variveis lgicas so representados pelas palavras reservadas


verdadeiro e falso.

So tambm empregados tipos definidos pelo usurio, compreendendo es-


tes os tipos estruturados bsicos presentes nas linguagens de programao,
como arranjo e registro. A definio de um arranjo requer a indicao
dos limites dos ndices de acesso aos elementos, e a definio do tipo destes
elementos. Para um registro devem ser definidos os nomes de seus cam-
pos, assim como os tipos de cada um deles. Exemplos:

TipoLista = arranjo [1.. 10] de TipoNodo


TipoNodo = registro
A: inteiro
B: lgico
fim registro

Referncia a variveis estruturadas. A referncia a um elemento de


um arranjo feita atravs do nome da varivel do tipo arranjo, seguido de
uma expresso cujo resultado define um ndice, entre colchetes. Um campo
de um registro acessado separando com um ponto o nome da varivel do
tipo registro do nome do campo considerado. Exemplos:

NomeVarArr[10]
Reg.A

Ponteiros para variveis dinmicas. A definio de uma varivel do


tipo ponteiro feita indicando qual o tipo de dado para o qual este ponteiro
pode ser utilizado. A declarao de um ponteiro feita atravs do smbolo
seguido do tipo citado. Por exemplo, a declarao:

TipoPtNodo = inteiro

define uma varivel do tipo TipoPtNodo que somente poder apontar


(conter endereos de) para variveis do tipo inteiro.
Anexo 251

adotada a palavra reservada nulo para indicar que uma varivel dinmica
no contm um endereo vlido, ou seja, que contm um endereo nulo.
Este valor (nulo) pode somente ser testado.

Expresses aritmticas. Expresses aritmticas so escritas utilizando va-


lores literais, os nomes das variveis e dos parmetros, e operadores aritmti-
cos (+, -, *, /, div, etc.), podendo ser utilizados parntesis. Exemplo:

(A + 2) * B

Expresses lgicas. Expresses lgicas so compostas utilizando valores


literais, os nomes das variveis e dos parmetros, e os operadores relacionais
(<, >, =, etc.) e lgicos (e, ou e no). So utilizados parntesis para
facilitar a leitura das expresses. Exemplo:

(A = B) e (X < Y) ou (Z > 10)

Comandos de entrada e sada. As palavras ler e escrever identificam


respectivamente os comandos de entrada e de sada de um programa de apli-
cao. Em seguida, entre parntesis, definida a lista de variveis, separadas
por vrgulas, que devem ser preenchidas por leitura ou cujos valores devem
ser fornecidos como sada. Tratando-se de uma pseudo-linguagem, no
considerada formatao de dados. Exemplo:

escrever(A)

Comando de atribuio. Para representar uma atribuio utilizado o


smbolo , representando que a expresso direita atribuda varivel
esquerda. Os tipos do resultado da expresso e da varivel que receber o
valor devem ser compatveis. Exemplos:

A Info
PtNodo nulo

Comando composto. Sempre que a sintaxe exigir um s comando, poder


ser utilizado um comando composto, formado de um conjunto de comandos
delimitados pelas palavras reservadas incio e fim.

Comandos condicional e de seleo. O comando condicional apresenta


as clusulas se / ento, condicionando a execuo de um comando vali-
252 Anexo

dade da expresso lgica testada. O comando de seleo dupla acrescenta a


clusula seno, representando desta forma a seleo entre dois comandos,
um dos quais ser executado. Somente um comando segue as clusulas en-
to e seno, podendo este ser um comando composto. Exemplo:

se A = B
ento Sucesso falso
seno incio
se I = 0
ento I F
X 0
fim

Neste exemplo, a clusula seno composta por dois comandos, o comando


condicional se / ento, seguido de um comando de atribuio.

A seleo entre um de vrios comandos representada por um comando que


inicia com o cabealho caso <expresso> seja, seguido de uma lista de
comandos com rtulos. Somente um destes comandos vai ser executado
aquele cujo rtulo for igual ao valor da expresso do cabealho. O final deste
comando indicado pelas palavras reservadas fim caso. Exemplo:

caso A seja
1: X 0
2: incio
ler(A)
escrever(A)
fim
3: X Z
fim caso

Comandos de repetio. So utilizados os trs comandos de repetio


presentes na maioria das linguagens de programao. O comando para /
faa define um nmero fixo de repeties, controlado por uma varivel que
inicializada com o valor fornecido, incrementada a cada repetio de acordo
com o incremento definido, e testada para verificar o final das repeties. Um
s comando deve ser repetido, podendo ser utilizado um comando compos-
to. Exemplo:
Anexo 253

para Ind de Fim incr 1 at Ini faa


incio
A A + 1
L[Ind+1] L[Ind]
fim

O comando enquanto / faa repete um comando enquanto a expresso for-


necida for verdadeira. J o comando repita / at repete um conjunto de
comandos at que a expresso se torne verdadeira. Exemplos:

enquanto I F
faa incio
ler(A)
I I+1
fim
repita
ler(A)
escrever(A)
at que A = 0

Comandos de alocao e liberao de variveis dinmicas. A alo-


cao e a liberao de variveis dinmicas so executadas respectivamente
atravs dos comandos alocar e liberar, ambos apresentando uma varivel
do tipo ponteiro como parmetro.

Acesso a variveis dinmicas. Uma varivel dinmica referenciada


atravs do ponteiro que guarda seu endereo. Na pseudo-linguagem aqui
utilizada, o acesso a uma varivel dinmica feito atravs do nome do pon-
teiro seguido do smbolo que o identifica como ponteiro . A referncia
pode ser feita a uma varivel simples, a um elemento de um arranjo, ou a um
campo de um registro.

Funes. Neste texto so apresentados diversos algoritmos representando


subprogramas, sendo especificados seus parmetros de entrada e sada. Em
alguns casos explicitamente definido que o algoritmo apresentado corres-
ponde a uma funo. As funes so utilizadas para calcular um determi-
nado valor, identificado no seu cabealho como retorno, sendo definido o
tipo deste valor retornado.
leituras
recomendadas

AHO, Alfred V. et al. Data structures and algorithms. Indianapolis: Addison


Wesley, 1983.

CELES, Waldemar; CERQUEIRA, Renato; RANGEL, Jos Lucas. Introduo a


estruturas de dados: com tcnicas de programao em C. Rio de Janeiro:
Campus, 2004.

COLLINS, William J. Programao estruturada com estudos de casos em Pas-


cal. So Paulo: McGraw Hill,1988. /

CORMEN, Thomas H. et al. Algoritmos: teoria e prtica. Rio de Janeiro: Cam-


pus, 2002.

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


Thomson, 2002.

FORBELLONE, Andr L.; EBERSPCHER, Henri F. Lgica de programao: a


construo de algoritmos e estrutura de dados. So Paulo: Makron Books,
1993.

GOODRICH, Michael T.; TAMASSIA, Roberto. Estruturas de dados e algoritmos


em Java. 4. ed. Porto Alegre: Bookman, 2007.

GUIMARES, ngelo M.; LAGES, Newton A. C. Algoritmos e estruturas de


dados. Rio de Janeiro: LTC, 1994.

HOROWITZ, Ellis; SAHNI, Sartaj. Fundamentos de estruturas de dados. 2. ed.


Rio de Janeiro: Campus, 1987.
256 Leituras Recomendadas

KNUTH, Donald E. Fundamental algorithms. Indianapolis: Addinson-Wesley,


1968. (The art of computer programming, v. 1)

KNUTH, Donald E. Sorting and searching. Indianapolis: Addison-Wesley, 1973.


(The art of computer programming, v. 3)

LAFORE, Robert. Estruturas de dados e algoritmos em java. Rio de Janeiro:


Cincia Moderna, 2004.

LORENZI, Fabiana; MATTOS, Patrcia N.; CARVALHO, Tanisi P. Estruturas de


dados. So Paulo: Thompson, 2006.

MORAES, Celso R. Estruturas de dados e algoritmos: uma abordagem didti-


ca. So Paulo: Futura, 2003.

PEREIRA, Silvio L. Estruturas de dados fundamentais: conceitos e aplicaes.


So Paulo: rica, 2004.

PINTO, Wilson S. Introduo ao desenvolvimento de algoritmos e estrutura de


dados. So Paulo: rica, 1990.

SANTOS, Clesio Saraiva; EDELWEISS, Nina. Estruturas de dados. Porto Alegre:


UFRGS, 2000. Apostila de srie de livros didticos do Instituto de Inform-
tica da UFRGS.

SZWARCFITER, Jayme Luiz; MARKENZON, Llian. Estruturas de dados e seus


algoritmos. Rio de Janeiro: LTC, 1994.

TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe J. Estru-


turas de dados usando C. So Paulo: Makron Books, 1995.

TERADA, Routo. Desenvolvimento de algoritmos e estrutura de dados. So


Paulo: McGraw-Hill, 1991.

VELOSO, Paulo A. S. Estruturao e verificao de programas com tipos de


dados. So Paulo: Edgar Blucher, 1987.

VELOSO, Paulo A. S. et al. Estruturas de dados. Rio de Janeiro: Campus,


1983.
Leituras Recomendadas 257

VELOSO, Paulo A. S. Tipos (abstratos) de dados, programao, especificao,


implementao. In: ESCOLA DE COMPUTAO, 5., 1986, Belo Horizonte.

WIRTH, Nicklaus. Algoritmos & estruturas de dados. Rio de Janeiro: LTC,


1999.

ZIVIANI, Nvio. Projetos de algoritmos com implementaes em Pascal e C.


So Paulo: Thomson, 2003.
ndice

rvores, 168-182 exemplos de aplicaes, 209-213


conceitos bsicos, 168-170 clculo do valor de uma expresso
implementadas atravs de aritmtica, 212-213
contigidade fsica, 176-177 construo, 209-211
desvantagens, 178-180 montagem de uma lista, 211-212
por nveis, 177-178 n-ria em binria (Transformao),
por profundidade, 178 192-194
vantagens, 178-180 operaes, 194-209
implementadas por encadeamento, acesso aos nodos, 199-203
180-181 caminhamento central, 206-207
desvantagens, 182 caminhamento ps-fixado, 205-
operaes bsicas, 181-182 206
vantagens, 182 caminhamento prefixado, 203-205
operaes, 174-176 criao de rvore vazia, 195
terminologia, 170-174 destruio de uma rvore, 208-
rvores binrias, 190-240 209
balanceadas, 225-238 insero de novo nodo, 195-197
insero de novo nodo, 237-238 remoo de um nodo, 197-199
operaes de rotao, 228 rvores AVL, 226-227
simples direita, 228-230 Comando composto, 251
simples esquerda, 230-231 Comando condicional, 251-252
dupla direita, 231-234 Comandos de alocao e liberao de
dupla esquerda, 234-237 variveis dinmicas, 253
por altura, 226-227 Comando de atribuio, 251
balanceadas por freqncia, 238-240 Comandos de entrada e sada, 251
de pesquisa, 214-224 Comandos de repetio, 252-253
acesso a um nodo, 223-224 Comando de seleo, 251-252
insero de novo nodo, 216-218 Dados, 36-41
remoo de nodo, 219-223 AcrescentaDias (Funo), 39
260 ndice

EscreveExtenso (Funo), 39 Huffman, 239-240


estruturas, 36-41 Listas lineares, 49-112
InicializaData (Procedimento), 39 duplamente encadeadas, 102-110
tipos de, 36-41 acesso, 107-108
Deque, 147-156 com descritor, 108-110
Estrutura bsica de um algoritmo, 249 insero de novo nodo, 104-106
Estrutura de dados, 36-41 remoo de um nodo, 106-107
AcrescentaDias (Funo), 39 duplamente encadeada circular, 110-
EscreveExtenso (Funo), 39 115
InicializaData (Procedimento), 39 com descritor, 113-115
Expresses aritmticas, 251 insero de novo nodo, 111-112
Fila dupla, 147-156 remoo um nodo, 112-113
encadeadas, 151-156 encadeadas, 88-97
acesso a uma das extremidades, acesso a um nodo, 96-97
155-156 criao, 89-90
criao, 152 destruio, 97-98
insero de novo nodo, 153-154 insero de novo nodo, 90-95
remoo de um nodo, 154-155 remoo de um nodo, 95-96
implementadas por contigidade encadeada circular, 98-102
fsica, 148-151 acesso a um nodo, 102
acesso, 151 insero de novo nodo, 99-100
criao, 148-149 remoo de um nodo, 100-102
insero de novo nodo, 149-150 implementadas atravs de
remoo de um nodo, 150-151 contigidade fsica, 53-68
Filas, 137-145 acesso a um nodo, 65-69
implementadas por contigidade insero de novo nodo, 56-63
fsica, 137-142 lista linear vazia (Criao), 55-56
acesso, 142 remoo de um nodo, 63-65
criao, 140 implementadas atravs de
insero de um nodo, 140-141 contigidade fsica com descritor, 69-
remoo de um nodo, 141-142 79
implementadas por encadeamento, acesso a um nodo, 78-79
143-146 insero de novo nodo, 73-77
acesso, 145-146 lista linear vazia (Criao), 71-72
criao, 144 remoo de um nodo, 77-78
destruio, 146 com ocupao circular do arranjo, 80-
insero de um nodo, 144-145 87
remoo de um nodo, 145 acesso a um nodo, 85-87
Funes, 39 insero de novo nodo, 80-83
AcrecentaDias, 39 remoo de um nodo, 83-85
EscreveExtenso, 39 operaes, 51-52
ndice 261

Pilhas, 126-136 Ponteiros para variveis dinmicas, 250-


implementadas por contigidade 251
fsica, 128-132 Representao fsica (Alternativas), 41-
acesso, 131-132 44
criao, 129-130 contigidade fsica, 41-43
insero de um nodo, 130 encadeamento, 43-44
remoo de um nodo, 131 fsica mista, 44
implementadas por encadeamento, Tipos de dados, 36-41, 250
132-136 AcrescentaDias (Funo), 39
acesso, 135-136 EscreveExtenso (Funo), 39
criao, 133 InicializaData (Procedimento), 39
destruio, 136 Variveis dinmicas (Acesso), 253
insero de um nodo, 133-134
remoo de um nodo, 134-135