Prévia do material em texto
Algoritmos e Estrutura de Dados III Lista de exercício 1 1.(a) (b) A altura do nó de chave 7 é 3. A chave 7 encontra-se no 2º nível considerando a raiz como nível 0. A altura da árvore é igual a 5. (c) Existe, e seu comprimento é igual a 3. Não. (d) É o nó de chave 27. Os filhos são a chave 5 e 10. 34 e 39 são nós irmãos. (e) Pré-Ordem: 22,12,7,5,4,3,6,10,14,27,24,23,25,32,37,34,39. In-Ordem: 3,4,5,6,7,10,12,14,22,23,24,25,27,32,34,37,39. Pós-Ordem: 3,4,6,5,10,7,14,12,23,25,24,34,39,37,32,27,22. (f) 2. (a) (b) ( -,4,/,-,*,8,5,2,+,3,*,7,8 ) -> Foi obtida a partir do desenho da árvore, realizada para a expressão infixada. A expressão prefixada consiste em pegar a raiz, imprimir, chave a esquerda, imprimir, chave a direita, imprimir, e assim sucessivamente. (c) ( 4,8,5,*,2,-,3,7,8,*,+,/,- ) -> Foi obtida do mesmo modo que no exercício b, a partir do desenho da árvore, porém, na expressão posfixada, deve-se começar a impressão dos elementos, a partir da esquerda, depois direita, e assim raiz. 3. int alturaArvore(No* p) { if (p == NULL) return -1; int alturaEsq = alturaArvore(p->Esq); int alturaDir = alturaArvore(p->Dir); if (alturaEsq > alturaDir) return alturaEsq + 1; else return alturaDir + 1; } 4. int NRecInsere(Registro x, Apontador *p) { Apontador pAux; Apontador pAnt=NULL; pAux=*p; while(pAux!=NULL) { pAnt= pAux; if((pAux)->Reg.Chave > x.Chave) { (pAux)=(pAux)->Esq; }else if((pAux)->Reg.Chave < x.Chave) { (pAux)=(pAux)->Dir; }else { printf("Erro : Registro ja existe na arvore\n"); return -1; } } if(pAux==NULL) { Apontador pNo = (Apontador)malloc(sizeof(No)); pNo->Reg = x; pNo->Esq = NULL; pNo->Dir = NULL; if(pAnt==NULL) *p=pNo; else if(x.Chave < pAnt->Reg.Chave) pAnt->Esq = pNo; else pAnt->Dir = pNo; return 0; } } 5. void ListarTabulado(No *p,int nivel) { int i; nivel++; if (p != NULL) { for(i=1;i<nivel;i++) { printf(" "); } printf("%d\n",p->Reg.Chave); ListarTabulado(p->Esq,nivel); ListarTabulado(p->Dir,nivel); }else printf("---\n"); }