Escolar Documentos
Profissional Documentos
Cultura Documentos
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);