Buscar

Tvc3-EDLII-1-11-Tarde.Gabarito

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 3 páginas

Prévia do material em texto

UNIVERSIDADE FEDERAL DE JUIZ DE FORA 
INSTITUTO DE CIÊNCIAS EXATAS 
DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO 
 
3º TVC de Estrutura de Dados e Laboratório de Programação II – 04/07/2011 
ALUNO (A) _______________________________________________________________ Turma Lab:_____ ED:_____ 
ATENÇÃO: 
 Estrutura de Dados: questões de 1 a 4. Laboratório de Programação II: questões de 3 a 5. 
 Sempre que necessário, apresentar as definições das estruturas de dados. 
 Para as questões 2, 3, 4 e 5, considerar os tipos definidos a seguir: 
struct arv { 
 int info; 
 struct arv *esq; struct arv *dir; }; 
typedef struct arv Arv; 
tipo Arv = ref NO; 
tipo NO = reg(R: ESQ, int: INFO, R: DIR); 
_______________________________________________________________________________________________________________________________________________________________________________________________________________________ 
 
1) Definir a altura de um nó qualquer x em uma árvore e a altura de uma árvore. (15) 
- A altura de um nó x em uma árvore é é o número de passos do mais longo caminho que leva de x até uma 
folha. 
- Altura (ou profundidade) da árvore é o nível do nó folha que tem o mais longo caminho até a raiz. 
 
_______________________________________________________________________________________________________________________________________________________________________________________________________________________ 
 
2) Considerando uma árvore binária de números inteiros, fazer um procedimento para imprimir os valores dos 
nós múltipos do inteiro n fazendo um percurso em pós-ordem. Protótipo do procedimento: 
 void imp_n(Arv *a, int n) ou proc imp_n(Arv: A, int: N) (20) 
 
Em C: Em pseudolinguagem: 
void imp_n(Arv *a, int n) 
{ 
 if(!vazia(a)){ 
 imp_n(a->esq, n); 
 imp_n(a->dir, n); 
 if(a->info % n == 0) 
 printf(“%d\n”,a->info); 
 } 
} 
proc imp_n(Arv: A, int: N) 
 se não vazia(A) 
 imp_n(A.ESQ, N); 
 imp_n(A.DIR, N); 
 se A->INFO mod n = 0 
 imprima(A->INFO); 
 fim-se; 
 fim-se; 
fim-proc; 
 
_______________________________________________________________________________________________________________________________________________________________________________________________________________________ 
 
3) Desenvolver o procedimento imp para imprimir os valores de todos os nós da árvore binária de busca abb 
que estão dentro do intervalo fechado [x, y]. Considerar x menor que y e usar a propriedade fundamental de 
árvore binária de busca. (35) 
Protótipo em C: Protótipo em pseudolinguagem: 
void imp(Arv *abb, int x, int y) proc imp(Arv: ABB, int:X, int:Y) 
 
Em C: Em pseudolinguagem: 
void imp(Arv *abb, int x, int y) 
{ 
 if(abb != NULL) { 
 if(x > abb->info) 
 imp(abb->dir, x, y); 
 else if(y < abb->info) 
 imp(abb->esq, x, y); 
 else{ 
 imp(abb->esq, x, y); 
 imp(abb->dir, x, y); 
 printf(“%d\n”,abb->info); 
 } 
 } 
} 
proc imp(Arv: ABB, int:X, int:Y) 
 se ABB ≠ nil entao 
 se X > ABB->INFO entao 
 imp(ABB.DIR, X, Y); 
 senao se Y < ABB->INFO entao 
 imp(ABB.ESQ, X, Y); 
 senao 
 imp(ABB->ESQ, X, Y); 
 imp(ABB->DIR, X, Y); 
 imprima(ABB->INFO); 
 fim-se; 
 fim-se; 
 fim-se; 
fim-proc; 
 
 
 
 
UNIVERSIDADE FEDERAL DE JUIZ DE FORA 
INSTITUTO DE CIÊNCIAS EXATAS 
DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO 
_______________________________________________________________________________________________________________________________________________________________________________________________________________________ 
 
4) Dado o programa abaixo (em C e em pseudolinguagem): 
Arv* montaArv(int *v, int i, int f) 
//monta e retorna uma ABB com seus valores 
{ 
 int m; 
 Arv *a; 
 m = (i + f) / 2; 
 if(i<=f) 
 { 
 a = (Arv*)malloc(sizeof(Arv)); 
 a->info = v[m]; 
 a->esq = montaArv(v, i, m-1); 
 a->dir = montaArv(v, m+1, f); 
 } 
 else 
 a = NULL; 
 return a; 
} 
tipo TVET = vet[0..9]int; 
função montaArv(TVET:V, int:I, int: F):Arv 
//monta e retorna uma ABB com seus valores 
 int: M; 
 Arv: A; 
 M  (I + F) div 2; 
 se I<=F então 
 aloque(A); 
 A.INFO  V[M]; 
 A.ESQ  montaArv(V, I, M-1); 
 A.DIR  montaArv(V, M+1, F); 
 senão 
 A  nil; 
 fim-se; 
 montaArv  A; 
fim-função; 
int main() { 
 Arv *abb; 
 int v1[] = {7,9,13,21,22,25,26,32,35,50}; 
 abb = montaArv(v1,0,9); 
 return 0; } 
inicio 
 Arv: ABB; 
 TVET: V1  {7,9,13,21,22,25,26,32,35,50}; 
 ABB  montaArv(V1, 0, 9); 
fim; 
a) representar graficamente a árvore binária de busca abb (ou ABB) gerada após a execução do programa acima; 
b) representar graficamente a árvore binária de busca abb (ou ABB) do item (a) após a remoção do nó com valor 
22. (30) 
 
 
_______________________________________________________________________________________________________________________________________________________________________________________________________________________ 
 
5) Fazer o procedimento cont_i1f em C que calcula, para uma árvore binária: 
 o número de nós com valor impar; 
 o número de nós com um único filho. 
O procedimento cont_i1f deve percorrer a árvore binária APENAS UMA VEZ fazendo um percurso em pré 
ordem. Protótipo do procedimento: 
 
 void cont_i1f(Arv *ab, int *nimpar, int *n1filho) 
 
Cuidado com a inicialização e atualização dos parâmetros passados por referência em C. (35) 
 
 
 
 
 
 
 
 
 
 
 
 
a) b) 
UNIVERSIDADE FEDERAL DE JUIZ DE FORA 
INSTITUTO DE CIÊNCIAS EXATAS 
DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO 
Em C: 
//é necessário inicializar os valores nimpar e n1filho com zero. Para tanto 
//será criado um procedimento que realiza esta tarefa e chama, então, o 
//procedimento cont_i1f. 
void cont_inic_i1f(Arv *ab, int *nimpar, int *n1filho) 
{ 
 *nimpar = 0; 
 *n1filho = 0; 
 cont_i1f(ab, nimpar, n1filho); 
} 
 
void cont_i1f(Arv *ab, int *nimpar, int *n1filho) 
//percorre a árvore em pré ordem 
{ 
 if(ab != NULL) { 
 if(ab->info % 2 == 1) //conta nó com valor impar 
 (*nimpar)++; 
 if(tem_filho_unico(ab)) //conta nó com um único filho 
 (*n1filho)++; 
 
 cont_i1f (ab->dir, nimpar, n1filho); 
 cont_i1f (ab->esq, nimpar, n1filho); 
 } 
} 
 
//esta funcao retorna 1 se o nó tem um único filho ou zero caso contrário 
int tem_filho_unico(Arv *a){ 
 if(((ab->dir == NULL)&&(ab->esq != NULL)) || 
 ((ab->dir != NULL)&&(ab->esq == NULL)) ) 
 return 1; 
 return 0; 
} 
 
//obs: na funcao acima poder-se-ia usar o operador lógico xor (tem em C?): 
// if((ab->dir == NULL) xor (ab->esq == NULL))

Outros materiais