Você está na página 1de 10

Universidade de Braslia

Estrutura de Dados

Universidade de Braslia
1. rvores isomrficas so aquelas que tm o mesmo nmero de ns, distribudos da mesma maneira, independentemente dos contedos dos ns. Dadas duas rvores atravs dos ponteiros de acesso a1 e a2, faa uma funo para verificar se elas so isomrficas. #include <stdio.h> #include <stdlib.h> typedef struct nodo { char dado; struct nodo *filho, *irmao; } arvore; int LeArv(arvore **a1, arvore **a2) { int i=1,j=1; if (*a1 == NULL) i=0; if (*a2 == NULL) j=0; if (i=j) { a2 = a2->irmao; LeArv (&((*a1)->irmao)); a2 = a2->filho; LeArv (&((*a1)->filho)); return 1; } else return 0; } 3. dada em memria uma rvore binria cujo acesso se faz pelo ponteiro a1, contendo em cada n um caractere. Escreva uma funo de procura, que receba como parmetros o ponteiro a1 e um caractere x, e retorne um ponteiro para o n que contm x, ou retorne NULL se x no estiver presente na rvore. A funo deve armazenar em uma pilha de caracteres, todos (e apenas) os caracteres que estiverem no caminho entre a raiz da rvore e o n que contm x. #include<stdio.h> #include <stdlib.h> #include <string.h>

int vet[50]; int i=0;

struct pilha { char dado; struct pilha *prox; }; struct arvore

Estrutura de Dados

Universidade de Braslia
{ char dado; struct arvore *esq, *dir; }; struct pilha *pinicio, *p1; struct arvore *ainicio; void inicializapilha(struct pilha **pilha) { *pilha = NULL; return ; } void inserepilha(struct pilha **pilha, char dadonovo) { p1 = malloc(sizeof(struct pilha)); p1->dado = dadonovo; p1->prox = *pilha; *pilha = p1; return ; } } arvore *Procura(arvore *ainicio, char chave, arvore **pai) { do { arvore *a1; a1 = NULL; if(ainicio != NULL) { if(ainicio->dado == chave) { a1 = ainicio; } if(a1==NULL) { *pai = ainicio; a1 = Procura(ainicio->esq, chave, pai); } if(a1==NULL) { *pai = ainicio; a1 = Procura(ainicio->dir, chave, pai); } } if(a1 == NULL) { *pai = NULL; } vet[i] = a1->dado; i++; }while(*Pai != NULL) return ; }

void Constroi(struct arvore **earvore) { char k; k = getc(arq); if(k == '.') { *eainicio = NULL; } else { *eainicio = malloc(sizeof(struct arvore)); (*eanicio)->dado = k; Constroi(&((*eanicio)>esq)); Constroi(&((*eanicio)->dir)); Estrutura de Dados

Universidade de Braslia
} int main() { int Const; FILE *arq; char k; arq = fopen("texto1.txt","r"); printf("Digite a letra para ser procurada:\n"); sacanf("%c", &k); Constroi(arvore)); Procura(arvore, k, Pai); fclose(arq); for(Const=0;Const<=i;Const++) { inseripilha(*pilha, vet[Const]); }

return 0; }

5. So dadas em memria duas rvores binrias, contendo em cada elemento um caractere, atravs dos ponteiros de acesso a1 e a2. A primeira rvore no contm elementos repetidos. A segunda pode conter. Construa uma funo que escreva na tela todos os caracteres da rvore1 que estejam presentes na rvore2 na posio de folha da rvore. A soluo deve ser a mais eficiente possvel. No utilize variveis globais nem de outras estruturas alm das duas rvores. *eainicio = malloc(sizeof(arvore)); (*eainicio)->dado = c; constroi(&((*eainicio)->esq)); constroi(&((*eainicio)->dir)); } } void Comp1 (arvore *a3,arvore *a4){ arvore *a1; arvore *a2; a1=a3; a2=a4; Comp2 (a1,a2); if (a1!=NULL){ Comp1 (a1->esq,a2); Comp1 (a1->dir,a2); } } void Comp2 (arvore *a3,arvore *a4){

#include<stdio.h> #include<stdlib.h> FILE *arq1; typedef struct nodo{ char dado; struct nodo *esq, *dir; } arvore;

void constroi(arvore **); void Comp1 (arvore *,arvore *); void Comp2 (arvore *,arvore *); void constroi (arvore **eainicio) { char c; c=getc(arq1); if (c=='.') *eainicio = NULL; else {

Estrutura de Dados

Universidade de Braslia
arvore *a1; arvore *a2; a1=a3; a2=a4; if ((a1->dado == a2>dado)&&(a2->esq == NULL)&&(a2->dir == NULL)){ printf("%c ",a1->dado); } if (a2!=NULL){ Comp2 (a1,a2->esq); Comp2 (a1,a2->dir); } } } int main(){ 7. Construa uma funo para avaliar uma expresso aritmtica armazenada em uma rvore binria, como no exemplo abaixo: 2( A + B ) * C Suponha a existncia de uma funo-tabela contendo os valores inteiros correspondentes aos caracteres A, B, C ... #include <stdio.h> void constroi(arvore **); #include <stdlib.h> void leiturainfixada (arvore *); void infixada (arvore *); FILE *arq1; void ConversaoParaPosFixada (); FILE *arq2; int Prioridade (char ); num_elem = 0; int main(){ typedef struct nodo{ arvore *arv1=NULL; char dado; char vetor_de_elementos[50]; struct nodo *esq, *dir; char vet_convertidos[50]; } arvore; arq1 = fopen("t1a.txt", "r"); typedef struct tipopilhageral{ constroi(&arv1); char dado; fclose(arq1); struct tipopilhageral *prox; } pilhageral; arq2 = fopen("saida1.txt","w"); typedef struct tipopfilageral{ char dado; struct tipofilageral *prox; } filageral; infixada (arv1); for (i=0;i<nro_elementos;i++){ fscanf("saida1.txt","%c",&vetor_de _elementos[i]); arvore *arv1=NULL; arvore *arv2=NULL; arq1 = fopen("t1.txt", "r"); constroi(&arv1); fclose (arq1); arq1 = fopen("t1.txt", "r"); constroi(&arv2); fclose (arq1); Comp1 (arv1,arv2); system ("Pause"); return(0);

Estrutura de Dados

Universidade de Braslia
} for (i=0;i<nro_elementos;i++){ vet_convertidos = funcaotabela (vetor_de_elementos[i]); } fclose (arq2); arq2 = fopen("saida1.txt","w+"); for (i=0;i<nro_elementos;i++){ fscanf("saida1.txt","%c",&vet_conv ertidos[i]); } ConversaoParaPosFixada (); system ("Pause"); return(0); } fprintf("saida1.txt","%c",a1>dado); nro_elementos = num_elem + 1; infixada (a1->dir); } } void ParaPosFixada () { pilhageral tipopilha *p1; filageral *f1; char c, aux; InicializaPilha (&p1); InicializaFila (&f1); arq = fopen ("saida1.txt", "r"); while ((c = getc (arq)) != EOF) { if (c != '\n'){ if ((c!='^')&&(c!='+')&&(c!='')&&(c!='*')&&(c!='/')&&(c!='(')&&( c!=')')) InsereFila (&f1, c); else if (c==')') { while (TopoPilha(p1) != '(') InsereFila (&f1, RetiraPilha (&p1)); aux = RetiraPilha (&p1); } else { if ((c!='(') && (!PilhaVazia (p1))){ while ((Prioridade (TopoPilha (p1)) <= Prioridade (c))&&(!PilhaVazia (p1))) InsereFila (&f1, RetiraPilha (&p1)); } InserePilha (&p1,c); } }

void constroi (arvore **eainicio) { char c; c=getc(arq1); if (c=='.') *eainicio = NULL; else { (*eainicio) = malloc(sizeof(arvore)); (*eainicio)->dado = c; constroi(&((*eainicio)->esq)); constroi(&((*eainicio)->dir)); } }

void infixada (arvore *a2){ arvore *a1; a1=a2; if (a1!=NULL){ infixada (a1->esq); Estrutura de Dados

Universidade de Braslia
} fclose (arq); while (!PilhaVazia (p1)) InsereFila (&f1, RetiraPilha (&p1)); while (!FilaVazia (f1)) printf ("%c", RetiraFila (&f1)); } int Prioridade (char c1) { 9. dada em memria uma rvore binria que representa uma rvore genrica, contendo um caractere em cada n. No h caracteres repetidos na rvore. Faa uma funo que receba como parmetro o ponteiro de acesso arvore a1. A funo deve gerar na tela uma listagem de todos os caracteres presentes na rvore, cada um seguido pelo nmero de filhos que esse n tenha. char c; #include <stdio.h> arvoreg *a1, *a2; #include <stdlib.h> int n, i; *eainicio = NULL; while ((c = getc (arq)) != EOF) { if (c != '\n'){ if (*eainicio != NULL) a1 = ProcuraG (eainicio, c); else { a1 = malloc (sizeof (arvoreg)); a1->dado = c; a1->filho = NULL; a1->irmao = NULL; *eainicio = a1; } fscanf (arq, "%d ", &n); for (i=1; i !=n+1; i++) { c = getc (arq); if (a1->filho == NULL) { a1->filho = malloc (sizeof (arvoreg)); a2 = a1->filho; } else { a2->irmao = malloc (sizeof (arvoreg)); a2 = a2->irmao; } switch (c1) { case '^' : return 1; break; case '*' : case '/' : return 2; break; case '+' : case '-' : return 3; break; case '(' : return 4; break; } }

typedef struct nodo { char dado; struct nodo *filho, *irmao; } arvoreg ; arvoreg *ProcuraG(arvoreg **eainicio, char chave) { arvoreg *a1; a1 = NULL; if (*eainicio != NULL) { if ((*eainicio)->dado == chave) a1 = *eainicio; if (a1 == NULL) a1 = ProcuraG ((&((*eainicio)>filho)), chave); if (a1 == NULL) a1 = ProcuraG ((&((*eainicio)>irmao)), chave); } return a1; } arvoreg *aini; FILE *arq, *arqsai; void ConstroiG(arvoreg **eainicio) { Estrutura de Dados

Universidade de Braslia
a2->dado = c; a2->filho = NULL; a2->irmao = NULL; c = getc (arq); } } } } void LeG(arvoreg **eainicio) { arvoreg *a1; int n; if (*eainicio != NULL) { printf("%c %c", (*eainicio)>dado, ' '); a1 = (*eainicio)->filho; n = 0; while (a1 != NULL) { n = n + 1; a1 = a1->irmao; } printf ("%d", n); a1 = (*eainicio)->filho; while (a1 != NULL) { printf ("%c %c", ' ',a1->dado); a1 = a1->irmao; } printf ("\n"); LeG (&((*eainicio)->irmao)); LeG (&((*eainicio)->filho)); } } main () { char c, c1; arq = fopen ("t20.txt", "r"); ConstroiG (&aini); fclose (arq); LeG(&aini); printf("\n\n"); printf("\n\n"); system("pause"); }

11. dada uma rvore binria que representa uma rvore genrica, contendo em cada n um caractere. Faa uma funo que receba como parmetros o ponteiro de acesso rvore ainicio e dois caracteres c1 e c2. O procedimento deve inserir o caractere c1 na rvore, como filho de c2. Se o caractere c2 no estiver presente, a funo deve emitir uma mensagem e o n no deve ser inserido. #include <stdio.h> if (a1 == NULL) #include <stdlib.h> a1 = ProcuraDado ((&((*eainicio)->filho)), c2); if (a1 == NULL) typedef struct nodo { a1 = ProcuraDado char dado; ((&((*eainicio)->irmao)), c2); struct nodo *filho, *irmao; } } arvore ; return a1; } arvore *ProcuraDado(arvore **eainicio, char c2) { void InserirDado(arvoreg *ainicio, arvore *a1; char c1, char c2) { a1 = NULL; arvore *a1; if (*eainicio != NULL) { if ((*eainicio)->dado == c2) a1 = ProcuraDado (&ainicio, c2); a1 = *eainicio; if (a1 == NULL) Estrutura de Dados

Universidade de Braslia
printf ("O pai nao foi encontrado\n"); else { if (a1->filho == NULL) { a1->filho = malloc (sizeof (arvore)); a1 = a1->filho; } else { a1 = a1->filho; while (a1->irmao != NULL) a1 = a1->irmao; a1->irmao = malloc (sizeof (arvore)); a1 = a1->irmao; } a1->dado = c1; a1->filho = NULL; a1->irmao = NULL; } }

13. dada em memria uma rvore binria de pesquisa contendo em cada n um caractere. Elabore uma funo que receba como parmetros o ponteiro de acesso rvore ainicio e um caractere c, e que elimine da rvore todos os ns que contm caracteres menores ou iguais a c. #include <stdio.h> #include <stdlib.h> typedef struct nodo { char dado; struct nodo *dir, *esq; } arvore; void Remover (arvore **ea1) { if (*ea1 != NULL) { Remover (&((*ea1)->esq)); Remover (&((*ea1)->dir)); free (*ea1); *ea1 = NULL; } } void RemoveMDado (arvore **eainicio, char c) { arvore *a1, *ant; a1 = *eainicio; while (a1 != NULL) { if (c == a1->dado) { if (a1 == *eainicio) *eainicio = a1->dir; else if (ant->dir == a1) Estrutura de Dados ant->dir = a1->dir; else ant->esq = a1->dir; a1->dir = NULL; Remover (&a1); a1 = NULL; } else if (c < a1->dado) { ant = a1; a1 = a1->esq; } else if (a1 == *eainicio) { *eainicio = (*eainicio)->dir; a1->dir = NULL; Remover (&a1); a1 = *eainicio; } else { if (a1 == ant->esq) ant->esq = a1->dir; else ant->dir = a1->dir; a1->dir = NULL; Remover (&a1); a1 = ant->esq; }

Universidade de Braslia
} }

15. Construa uma funo recursiva para verificar se uma dada rvore est balanceada. #include <stdio.h> #include <stdlib.h> if (ainicio == NULL) return (0); else { adir = Altura (ainicio->dir); typedef struct nodo { char dado; struct nodo *filho, *irmao; } arvore; aesq = Altura (ainicio->esq); if (adir != aesq) return (0); else return (1); int Altura (arvore *ainicio) { int adir, aesq; } }

Estrutura de Dados

Você também pode gostar