Advertisement
Guest User

Untitled

a guest
Sep 20th, 2017
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. /*
  4.     Esse programa inmprime uma arvore graficamente ou seja:
  5.  
  6.             15
  7.            /    \
  8.          13     25
  9.          /\       / \
  10.        9  14  17 28
  11.       /              / \
  12.     6             27 31
  13.  
  14.     ficaria assim:  (15(13(9(6()))(14()))(25(17())(28(27())(31()))))
  15.     */
  16.  
  17. typedef struct informacao{ //
  18.    int valor;
  19. }informacao;
  20.  
  21. typedef struct no{
  22.    informacao dado;
  23.    struct no *sub_arvore_esquerda;
  24.    struct no *sub_arvore_direita;
  25. }no;
  26.  
  27. /*
  28. no * planta_arvore(no *arvore)
  29. {
  30.    arvore = NULL;
  31.    return(arvore);
  32. }
  33. */
  34.  
  35. void planta_arvore(no *arvore)
  36. {
  37.  arvore->dado.valor = -1;  
  38.  arvore->sub_arvore_esquerda = NULL;  
  39.  arvore->sub_arvore_direita = NULL;  
  40. }
  41.  
  42. bool esta_vazia(no arvore)
  43. {
  44. return arvore.sub_arvore_esquerda == NULL && arvore.sub_arvore_direita == NULL;
  45. }
  46.  
  47. no * insere(informacao info, no *arvore)
  48. {
  49.    if(arvore == NULL){
  50.       arvore = (no *)malloc(sizeof(no));
  51.       arvore->dado = info;
  52.       arvore->sub_arvore_esquerda = NULL;
  53.       arvore->sub_arvore_direita= NULL;
  54.       return(arvore);
  55.    }
  56.    if(info.valor < arvore->dado.valor){
  57. //       printf("%d inserido na esquerda",arvore->dado.valor);
  58.       arvore->sub_arvore_esquerda=insere(info,arvore->sub_arvore_esquerda);
  59.       return(arvore);
  60.    }
  61.    if(info.valor > arvore->dado.valor){
  62. //       printf("%d inserido na direita", arvore->dado.valor);
  63.       arvore->sub_arvore_direita=insere(info,arvore->sub_arvore_direita);
  64.       return(arvore);
  65.    }
  66.    else
  67.       return NULL;
  68. }
  69.  
  70. int imprime_pre_ordem(no *arvore)
  71. {/// a função ultilizada foi a pre-ordem pois imprime primeiro a raiz, depois segue pela esquerda e depois pela direita
  72.    int a=1,b=1;
  73.    if(arvore != NULL){
  74.       printf("(");
  75.       printf("%d",arvore->dado.valor);
  76.       a=imprime_pre_ordem(arvore->sub_arvore_esquerda);///a==0 caso sub_arvore_esquerda==NULL
  77.       b=imprime_pre_ordem(arvore->sub_arvore_direita);///a==0 caso sub_arvore_direita==NULL
  78.       if(b==0 && a==0)printf("()");///imprime  () se e somente se encontrar um nó folha
  79.       else if(b==0 && a!=0);///isso acontece se encontrar um nó com a perna direita null
  80.       else if(b!=0 && a==0);///isso acontece se encontrar um nó com a perna esquerda null
  81.       /**         Observações:
  82.       Existem tambem mais dois casos:
  83.          1°- Para imprimir quando a perna direita ou esquerda for null ou seja quando as raizes da arvore não estiverem completas basta retirar a condição da linha 50 (obs:só imprimira as "pernas" vazias)e atualizar o resto assim:
  84.          if(b==0 && a!=0)printf("()");
  85.          if(b!=0 && a==0)printf("()");
  86.          
  87.          2°- Para imprimir quando a perna direita ou esquerda for null ou as duas basta retirar a condição da linha 50,51,52 e fazer uma condição para cada assim:
  88.          if(b==0)printf("()");
  89.          if(a==0)printf("()");
  90.      
  91.       That's All Folks! (É só isso pessoal!)
  92.       **/
  93.       printf(")");///fecha a representação de uma raiz
  94.    }else return 0;//retorna 0 caso arvore == NULL
  95. }
  96. //         testes realizados:
  97. //  caso ativado: (15(13(9(6()))(14()))(25(17())(28(27())(31()))))
  98. //  1° caso: (15(13(9(6()())())(14()()))(25(17()())(28(27()())())))
  99. //  2° caso: (15(13(9(6)())(14))(25(17)(28(27)())))
  100.  
  101. void imprimir(no *arvore)
  102. {
  103.     printf("(");
  104.     if(arvore == NULL)
  105.         printf("-1"); // imprime -1 se encontrar um no folha
  106.     else{
  107.         printf("%d", arvore->dado.valor);
  108.         imprimir(arvore->sub_arvore_esquerda);
  109.         imprimir(arvore->sub_arvore_direita);
  110.     }
  111.     printf(")");
  112. }
  113.  
  114. int main()
  115. {
  116.    no arvore,
  117.    *arv,
  118.    *arv2;
  119.    informacao dado;
  120.    int ret,i;
  121.    printf("quantos nos tem a arvore? ");
  122.    scanf("%d",&ret);
  123.    printf("\n");
  124.    arvore = planta_arvore(&arvore);
  125.    
  126.    for(i=0;i<ret;i++){
  127.      printf("quantos nos tem a arvore? ");
  128.       scanf("%d",&dado.valor);
  129.       arvore = insere(dado,arvore);
  130.       if(arvore == NULL);
  131.    }
  132.    printf("\nEm ordem :");
  133.    //imprime_pre_ordem(arvore);
  134.    imprimir(arvore);
  135.    printf("\n");
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement