Você está na página 1de 4

Estruturas de Dados

Lista 3.
J. L. Rangel
1. provar que uma árvore binária de altura h tem, no mínimo, h+1 nós, e, no
máximo, 2h+1 –1.
2. (a) simule a chamada show(r), sendo show e r como acima, para verificar que o
resultado da chamada é a impressão de
"a b d c e f "
(b) Repita a experiência executando um programa que crie e mostre a árvore, usando
o seu compilador de C favorito.
3. modifique a programação de show, de forma que a saída impressa reflita, além do
conteúdo de cada nó, a estrutura da árvore, usando a notação introduzida
anteriormente. Assim, show teria a seguinte saída para a árvore do Exemplo 1 do
Cap. 6:
<a<b<><d<><>>><c<e<><>><f<><>>>>
4. escreva uma função
int altura(ARV a);
que percorre uma árvore binária para determinar sua altura.
5. Verifique o resultado da aplicação das três funções apresentadas acima na árvore
da Fig. 1 do Capítulo 6.
6. Escrever uma função que retira um nó qualquer de uma árvore binária de busca,
por exemplo, o nó que tem o valor v. A árvore resultante deve, naturalmente,
manter a propriedade fundamental.
7. Invente uma estrutura apropriada para representar um fragmento de árvore
genealógica, com operações como pai, mãe, filho, tio, sobrinha, etc. Como pode
uma operação devolver zero ou mais resultados?
8. Escrever uma função para
a. copiar uma árvore
b. somar os conteúdos de todos os nós de uma árvore
c. determinar o valor do máximo conteúdo de um nó da árvore
d. listar o conteúdo dos nós de uma árvore em pré-ordem
e. idem, na ordem inversa da pré-ordem
Fazer isto para árvores binárias, e para árvores.
9. Escrever uma função para converter uma árvore binária em árvore.
10. Escrever funções não recursivas para listar os conteúdos dos nós de uma árvore
binária em pré-ordem, ordem simétrica e pós-ordem.
11. Uma árvore binária é usada para descrever uma expressão. Os nós podem ser
• folhas com números inteiros (com sinal);
Estruturas de Dados J .L. Rangel 1
• nós rotulados por “operadores +, *, -, /, cada um com 2 filhos.
Escreva um avaliador que percorre a árvore para obter o resultado da expressão. Por
exemplo,
+
/ \
3 *
/ \
2 4
seria transformada pelo avaliador em
+
/ \
3 8
e depois em
24
12. Há três notações para representar expressões com operadores binários:
• a “infixada”, em que um operador vem entre seus operandos, e parênteses são
usados para indicar a ordem de avaliação, quando a ordem definida pela
precedência dos operadores não é a desejada
• a pré-fixada, em que o operador sempre vem antes de seus dois operandos
• a pós-fixada em que o operador sempre vem depois de seus dois operandos.
Nos dois últimos casos, às vezes chamados de notação polonesa, não há necessidade
de parênteses.
Por exemplo, (a+b)*(c+d), *+ab+cd e ab+cd+* são representações da mesma
expressão, que pode também ser representada por uma árvore de expressão
*
/ \
/ \
+ +
/ \ / \
a b c d
Escreva funções para converter expressões entre as 4 formas de representação. Por
exemplo, de cada uma das três formas de representação para árvore, e de árvore para
cada uma das três formas de representação.
13. Dependendo da ordem de inserção, uma árvore binária de busca com n=7 nós
pode ter alturas entre 2 e 6.
• Supondo que todas as 7! ordens tem a mesma probabilidade, qual é a
probabilidade de obtermos uma árvore com altura 2, 3, …, 6, etc. ?
• Quantas árvores binárias diferentes existem, com n=7 nós?
Estruturas de Dados J .L. Rangel 2
14. Construa um tipo “pilha de reais” usando uma lista encadeada.
15. Suponha uma lista simplesmente encadeada, terminada por NULL representada
pelo tipo PT abaixo:
typedef struct no *PT;
struct no {
char val;
PT prox;
};
Escreva uma função com protótipo
PT ultx(PT l);
que devolve um apontador para o último nó da lista l que contém o caracter 'x'.
16. Defina um tipo pessoa, com auxílio dos construtores struct e union, que
contenha a seguinte informação:
Nome
Endereço
Telefone
Sexo: 'M' ou 'F'
(no caso de sexo = 'M')
situação militar: completo ('C') ou incompleto ('I')
(no caso de sexo = 'F')
nome de solteira
17. Suponha as seguintes declarações, relativas a um tipo “árvore binária” BIN:
typedef struct nob NOB, *PTB;
struct nob {
int val;
PT esq, dir;
}
typedef PTB BIN;
e a um tipo de “árvore”, ARV
typedef struct noa NOA, *PTA;
struct noa {
int val;
PT prim, prox;
}
typedef PTA ARV;
a. Escreva uma função com protótipo
BIN copia(BIN b);
que faça uma cópia da árvore binária b, “nó por nó”.
b. Idem, árvore.
ARV copia(ARV a);
18. Escreva uma função com protótipo
int soma(BIN b);

Estruturas de Dados J .L. Rangel 3


que calcule a soma de todos os campos val da árvore binária b.
19. Idem, árvore.
int soma(ARV a);
20. Escreva uma função com protótipo
int max(BIN b);
que calcule o valor máximo de todos os campos val da árvore binária b.
21. Idem, árvore.
int max(ARV a);
22. Escreva funções
void showpre(BIN b);
void showsim(BIN b);
void showpos(BIN b);
void showinv(BIN b);
para mostrar o conteúdo (campo val) dos nós da árvore b em pré-ordem, ordem
simétrica, pós-ordem, e na ordem inversa da pré-ordem.
23. Considere uma árvore binária de busca, contendo a seguinte informação por nó:
int matric; /* número de matrícula */
char nome [120]; /* nome do funcionário */
char ender [120]; /* endereço do funcionário */
char fones[80]; /* telefone(s) do funcionário */
char depto; /* departamento em que trabalha */
Como esta informação ocupa um espaço relativamente grande, defina uma
estrutura(struct) com esta informação, e use no nó da árvore apenas um apontador
para a estrutura. Descreva um TAD (tipo abstrato de dados) árvore de busca, com as
operações necessárias. Não esqueça de definir a função maior(), que dará a
ordenação da árvore, que deve ser por ordem alfabética de nome.
24. Complete o exemplo do conjunto acrescentando funções para fazer união,
interseção e diferença de conjuntos.
25. Descreva uma estrutura “lista de dados duplamente encadeada”, e escreva as
funções para introduzir ou remover um elemento, supondo que introdução e
inserção serão possíveis em qualquer uma das duas extremidades.
26. Complete o exemplo da “lista de LISP”, para permitir o uso de átomos que são
cadeias de símbolos.
27. Projete um tipo de dados “caderno de endereços”. Este tipo deve ser uma lista de
“registros” cada um dos quais contém uma combinação de informações
apelido/nome/endereço/telefone, sendo proibido repetir apelidos. O caderno de
endereços deve poder ser consultado pelo apelido, ou por pedaços de nome. Por
exemplo, [“Zé”, “José Silva”, “Rua das Casas, 1”, “000-0000”] pode ser
encontrado procurando o apelido “Zé”, ou os pedaços de nome “José” e “Silva”.
Neste segundo caso, mais de um registro poderia ser recuperado.
Descreva e implemente o tipo “caderno de endereços” e suas operações.
(mai 00)

Estruturas de Dados J .L. Rangel 4

Você também pode gostar