O documento apresenta 15 exercícios sobre estruturas de dados arvoradas e hash, pedindo para descrever algoritmos de inserção e remoção em árvores AVL e binárias, implementar funções de busca, percursos e contagem de folhas em árvores, e demonstrar o funcionamento de TRIEs e tabelas hash.
1. Exercícios
1) Descreva numa notação mais precisa os algoritmos de inserção e de remoção em arvores
AVL, de pesquisa digital, binária de busca sem entrarem muitos pormenores de
programação.
2) Podemos utilizar árvores binárias para representar expressões aritméticas (como ((a+b)*c-
d)/(e-f) +g, por exemplo). Tente desenhar uma árvore para a expressão acima, e explique
como poderíamos implementar o cálculo da expressão.
3) Para a busca de um elemento numa árvore podemos escrever a função abaixo. Teste a
função e explique o seu funcionamento.
// Função para procurar um elemento numa arvore
ARV procura (ARV a , int b)
{
if (EMPTY(a)) return NULL;
else
if ( a->info == b ) return a;
else
if ( b > a->info )
return procura (a->dir, b);
else return procura (a->esq, b);}
4) Um percurso numa árvore mostra os elementos ali armazenados. No caso de uma árvore
binária, podemos percorrer usando 3 estratégias: em ordem, pré-ordem e pós-ordem. A
função abaixo mostra uma função de percurso em ordem (esquerda-raiz-direita). Teste a
função e mostre o resultado para os elementos de uma árvore binária qualquer.
//Função para percorrer a árvore respeitando o critério EM ORDEM
void inOrder (ARV a)
{
if (! EMPTY(a) )
{ inOrder(a->esq);
printf(" %d ", a->info);
inOrder(a->dir);
5) Faça as funções para os percursos pré-ordem (raiz-esquerda-direita) e pós-ordem
(esquerdadireita-raiz).
6) Implemente uma função que retorne a quantidade de folhas de uma árvore binária. Essa
função deve obedecer ao protótipo: int folhas (Arv* a);
Solução
int folhas (Arv* a)
{
if (arv_vazia(a->esq) && arv_vazia(a->dir))
return 1;
else if (!arv_vazia(a->esq) && arv_vazia(a->dir))
return folhas(a->esq);
else if (arv_vazia(a->esq) && !arv_vazia(a->dir))
return folhas(a->dir);
return folhas(a->esq) + folhas(a->dir);
}
2. 7) Considere a árvore AVL a seguir:
30
25 45
15 41 56
35 43 50
Realize, na árvore acima, as inserções das seguintes chaves 49, 60, 65, e em seguida a
remoção das chaves 45 e 41, escolhendo necessariamente imediatamente precedente para a
posição da chave removida. Mostre todas as rotações e o formato da árvore após cada
operação.
8) Mostre passo a passo a árvore binária resultante das seguintes operações:
a) Inserção de 7, 8, 3, 4, 2, 1, 6, 5
b) Mostre o percurso em pré-ordem, em-ordem e pós-ordem
c) Remoção de 7 e 6
9) Quais chaves/palavras estão representadas nesta TRIE?
Solução: foi, fora, fui vai, ver, veremos, vi, viu, vimos
10) Demonstre a árvore TRIE (passo a passo) para as seguintes chaves, bem como seus
significados:
MACA – MACHO – MATO – BALA – BANANA – BALELA - BALEIA
Solução
4. Solução
Índices gerados a partir da inserção no TRIE.
1 -> Utilizada para socorrer pessoas
2 -> Gênero encontrado na natureza
3 -> Local com árvores e animais
4 -> Doce conhecido entre crianças e “professores”
5 -> Fruta tropical
6 -> No sentido de enrolação
7 -> Animal encontra no mar
11) Qual seria o resultado utilizando uma árvore TRIE A partir das digitações abaixo:
Solução
B -> BALA, BALEIA, BALELA, BANANA
BA -> BALA, BALEIA, BALELA, BANANA
BAL -> BALA, BALEIA, BALELA
BALE -> BALEIA, BALELA
BALEL -> BALELA
12) Dada uma árvore PATRICIA, forneça as seguintes informações:
a) Conceito
b) Características
c) Funcionamento de Inserção/Remoção
d) Exemplo
13) Descreva o funcionamento das pesquisas seqüencial e binária e proponha algoritmos para as
mesmas. Utilize alocação estática ou dinâmica.
Solução
Sequencial.c
#include <stdio.h>
#include <stdlib.h>
#define TAMANHO 10
int main () {
int vetor[TAMANHO] = {0,3,4,7,5,2,9,6,1,8};
int valor = 11;
int i;
int encontrado;
i = 0;
encontrado = 0; /*Falso*/
while (i < TAMANHO && !encontrado) {
if (vetor[i] == valor) {
encontrado = 1; /*Verdadeiro*/
} else {
i++; }
}
if (encontrado) {
printf ("Valor %d encontrado na posicao %dn", vetor[i], i);
} else {
printf ("Valor %d nao encontradon", valor);
}
system("pause");
return 0;
}
5. Binária.c
#include <stdio.h>
#include <stdlib.h>
#define TAMANHO 10
int main () {
int vetor[TAMANHO] = {0,1,2,3,4,5,6,7,8,9};
int valor = 3;
int encontrado;
int direita, esquerda, meio;
encontrado = 0; /*Falso*/
esquerda = 0;
direita = TAMANHO - 1;
while (esquerda <= direita && !encontrado) {
meio = (direita + esquerda) / 2;
if (vetor[meio] == valor)
encontrado = 1; /*Verdadeiro*/
else if (valor < vetor[meio])
direita = meio - 1;
else
esquerda = meio + 1;
}
if (encontrado) {
printf ("Valor %d encontrado na posicao %dn", vetor[meio],
meio);
} else {
printf ("Valor %d não encontradon", valor);
}
return 0;
}
14) Dada uma tabela Hash, forneça as seguintes informações:
a) Conceito
b) Características
c) Funcionamento
15) Demonstre a inserção das chaves 5, 28, 19,15,20,33,12,17 e 10 em uma tabela hash com
colisões resolvidas por encadeamento. Considere a tabela com 9 posições e a função hash
como sendo h(k) = k mod 9