aquece para a prova de eda3

5
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); }

Upload: criatividadezerodocs

Post on 05-Jul-2015

1.386 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Aquece Para a prova de EDA3

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);

}

Page 2: Aquece Para a prova de EDA3

7) Considere a árvore AVL a seguir:

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

30

41 56

45

15

25

35 43 50

Page 3: Aquece Para a prova de EDA3

1 2 3 4

5 6

7

Page 4: Aquece Para a prova de EDA3

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 %d\n", vetor[i], i);

} else {

printf ("Valor %d nao encontrado\n", valor);

}

system("pause");

return 0;

}

Page 5: Aquece Para a prova de EDA3

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 %d\n", vetor[meio],

meio);

} else {

printf ("Valor %d não encontrado\n", 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