Advertisement
CaduUnb

ArvRascunho.c

May 14th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.05 KB | None | 0 0
  1. /*
  2. Exercicio de arvore binaria
  3. 1- Cria uma arvore;
  4. 2- Inclui elementos;
  5. 3- Exclui elementos;
  6. 4- Apaga arvore;
  7.  
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11.  
  12. typedef struct No{
  13.     int conteudo;
  14.     struct No *esquerda, *direita;
  15. } laco;
  16. #define true 1
  17. #define false 0
  18.  
  19. int      ArvContemSoma(laco *ptrArvore, int somaProcurada);
  20. laco*    ArvCriaRaiz(int conteudo);
  21. laco*    ArvInsere(laco *ptrArvore, int conteudo);
  22. void     ArvLibera(laco *ptrArvore);
  23. void     ArvMostra(laco *ptrArvore);
  24. laco*    ArvNovoNo(int conteudo);
  25. int      ArvProcura(laco *ptrArvore, int valorProcurado);
  26. int      ArvTamanho(laco *ptrArvore);
  27. int      ArvMaiorGalho(laco *ptrArvore);
  28.  
  29. int main(){
  30.     laco *ptrArvore;
  31.     int conteudo, result;
  32.     //Cria uma arvore binaria------------------------------------------------------------- 
  33.     //  2
  34.     //1   3
  35.     ptrArvore = ArvNovoNo(2);
  36.     ptrArvore->esquerda = ArvNovoNo(1);
  37.     ptrArvore->direita  = ArvNovoNo(3);
  38.     //Tentativa de inserir automaticamente e de maneira organizada-------------------------------------------------------------
  39.     // while(true)
  40.     // {
  41.     //printf("Insira os valores desejados:\n");
  42.     //  scanf("%d", &conteudo);
  43.     //  if(conteudo == 100)
  44.     //      break;
  45.     //  ptrArvore = ArvNovoNo(conteudo);
  46.     // }
  47.  
  48.     printf("Raiz da arvore: %d\tEsquerda: %d\n", ptrArvore->conteudo, ptrArvore->esquerda->conteudo);
  49.     printf("Insira o valor a ser procurado\n");
  50.     scanf("%d", &conteudo);
  51.     result  =  ArvProcura(ptrArvore, conteudo);
  52.     if(result)
  53.         printf("Encontrado o valor.\n\n");
  54.     else
  55.         printf("Sorry, not found.\n\n");
  56.     ArvMostra(ptrArvore);
  57.     printf("Ha %d no´s na arvore criada\n", ArvTamanho(ptrArvore));
  58.     printf("O galho mais longo possui profundidade %d\n", ArvMaiorGalho(ptrArvore));
  59.     printf("Checar se ha´ algum caminho cujo somatorio de a soma procurada. Qual o valor da soma?\n");
  60.     scanf("%d", &conteudo);
  61.     if(ArvContemSoma(ptrArvore, conteudo))
  62.         printf("Contem um caminho!\n");
  63.     else printf("Nao ha caminhos que resultem na soma procurada.\n");
  64.     ArvLibera(ptrArvore);
  65.     return 0;
  66. }
  67.  
  68. //lib.
  69. int ArvContemSoma(laco* ptrArvore, int somaProcurada){
  70.     if(ptrArvore==NULL||somaProcurada==0)
  71.         return (somaProcurada==0);
  72.     //Senao chegou ao fim, procura nos filhos
  73.     int parciais = somaProcurada - ptrArvore->conteudo;
  74.     return(ArvContemSoma(ptrArvore->esquerda, parciais) ||
  75.         ArvContemSoma(ptrArvore->direita, parciais));
  76. }
  77. laco*    ArvInsere(laco *ptrArvore, int conteudo){
  78.     if(ptrArvore == NULL) //(Sub)Arvore vazia
  79.         return ArvNovoNo(conteudo);
  80.     if(conteudo<=ptrArvore->conteudo)//Menor valor no laco da esquerda.
  81.         ptrArvore->esquerda = ArvInsere(ptrArvore->esquerda, conteudo);
  82.     else
  83.         ptrArvore->direita = ArvInsere(ptrArvore->direita, conteudo);
  84.     return ptrArvore;
  85. }
  86. void ArvLibera(laco *ptrArvore){
  87.     if(ptrArvore==NULL)
  88.         return;
  89.     ArvLibera(ptrArvore->esquerda);
  90.     ArvLibera(ptrArvore->direita);
  91.     free(ptrArvore);
  92. }
  93. int      ArvMaiorGalho(laco *ptrArvore){
  94.     if(ptrArvore==NULL)
  95.         return 0;
  96.     int GalhoEsq = ArvMaiorGalho(ptrArvore->esquerda);
  97.     int GalhoDir = ArvMaiorGalho(ptrArvore->direita);
  98.     printf("Esquerda: %d\tDireita: %d\n", GalhoEsq, GalhoDir);
  99.     if(GalhoEsq>GalhoDir) return GalhoEsq+1;
  100.     else                  return GalhoDir+1;
  101. }
  102.  
  103. void ArvMostra(laco *ptrArvore){
  104.     //Mostra a arvore no sentido Simetrico esquerda-Raiz-direita
  105.     if(ptrArvore == NULL)
  106.         return;
  107.     ArvMostra(ptrArvore->esquerda);
  108.     printf("%d\t%p\n", ptrArvore->conteudo, ptrArvore);
  109.     ArvMostra(ptrArvore->direita);
  110. }
  111. laco* ArvNovoNo(int conteudo){
  112.     laco* novo = (laco*) malloc(sizeof(laco));
  113.     novo->conteudo = conteudo;
  114.     novo->esquerda = novo->direita = NULL;
  115.     return novo;
  116. }
  117.  
  118. int ArvProcura(laco *ptrArvore, int valorProcurado){
  119.     int aux;
  120.     if(ptrArvore == NULL)
  121.         return false;
  122.     if(ptrArvore->conteudo == valorProcurado){
  123.         printf("Endereco: %p\t%d\n", ptrArvore, ptrArvore->conteudo);
  124.         return true;
  125.     }
  126.     aux = ArvProcura(ptrArvore->esquerda, valorProcurado);
  127.     aux = ArvProcura(ptrArvore->direita, valorProcurado);
  128. }
  129. int      ArvTamanho(laco *ptrArvore){
  130.     if(ptrArvore==NULL)
  131.         return(0);
  132.     return 1+ ArvTamanho(ptrArvore->esquerda) + ArvTamanho(ptrArvore->direita);
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement