Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6.  
  7. typedef struct{
  8.   int conta;
  9. }contador;
  10.  
  11. void iniciacontador(contador *p){
  12.   p->conta=0;
  13. }
  14.  
  15. /* Cada nó armazena três informações:
  16.    nesse caso um número (num),
  17.    ponteiro para subárvore à direita (sad)
  18.    e ponteiro para subárvore à esquerda (sae).*/
  19. typedef struct tree
  20. {
  21.   int num;
  22.   struct tree* sad;
  23.   struct tree* sae;
  24. } Tree;
  25.  
  26. /* A estrutura da árvore é representada por um ponteiro
  27.    para o nó raiz. Com esse ponteiro, temos acesso aos
  28.    demais nós. */
  29.  
  30. /* Função que cria uma árvore */
  31. Tree* createTree()
  32. {
  33.  
  34.   /* Uma árvore é representada pelo endereço do nó raiz,
  35.      essa função cria uma árvore com nenhum elemento,
  36.      ou seja, cria uma árvore vazia, por isso retorna NULL. */
  37.   return NULL;
  38. }
  39.  
  40. /* Função que verifica se uma árvore é vazia */
  41. int treeIsEmpty(Tree* t)
  42. {
  43.   /* Retorna 1 se a árvore for vazia e 0 caso contrário */
  44.   return t == NULL;
  45.  
  46. }
  47.  
  48. /* Função que mostra a informação da árvore */
  49. void preordem(Tree* t)
  50. {
  51.   /* Essa função imprime os elementos de forma recursiva */
  52.  
  53.   printf("<"); /* notação para organizar na hora de mostrar os elementos */
  54.   if(!treeIsEmpty(t)) /* se a árvore não for vazia... */
  55.   {
  56.     /* Mostra os elementos em pré-ordem */
  57.     printf("%d", t->num); /* mostra a raiz */
  58.     preordem(t->sae); /* mostra a sae (subárvore à esquerda) */
  59.     preordem(t->sad); /* mostra a sad (subárvore à direita) */
  60.   }
  61.   printf(">"); /* notação para organizar na hora de mostrar os elementos */
  62. }
  63.  
  64. void posordem(Tree* t){
  65.   printf("<"); /* notação para organizar na hora de mostrar os elementos */
  66.   if(!treeIsEmpty(t)) /* se a árvore não for vazia... */
  67.   {
  68.     /* Mostra os elementos em pré-ordem */
  69.     posordem(t->sae); /* mostra a sae (subárvore à esquerda) */
  70.     posordem(t->sad); /* mostra a sad (subárvore à direita) */
  71.     printf("%d", t->num); /* mostra a raiz */
  72.   }
  73.   printf(">"); /* notação para organizar na hora de mostrar os elementos */
  74. }
  75.  
  76. void inordem (Tree* t){
  77.   /* Essa função imprime os elementos de forma recursiva */
  78.  
  79.   printf("<"); /* notação para organizar na hora de mostrar os elementos */
  80.   if(!treeIsEmpty(t)) /* se a árvore não for vazia... */
  81.   {
  82.     /* Mostra os elementos em pré-ordem */
  83.     inordem(t->sae); /* mostra a sae (subárvore à esquerda) */
  84.     printf("%d", t->num); /* mostra a raiz */
  85.     inordem(t->sad); /* mostra a sad (subárvore à direita) */
  86.   }
  87.   printf(">"); /* notação para organizar na hora de mostrar os elementos */
  88. }
  89.  
  90. /* Função que insere um dado na árvore */
  91. void insertTree(Tree** t, int num)
  92. {
  93.   /* Essa função insere os elementos de forma recursiva */
  94.   if(*t == NULL)
  95.   {
  96.     *t = (Tree*)malloc(sizeof(Tree)); /* Aloca memória para a estrutura */
  97.     (*t)->sae = NULL; /* Subárvore à esquerda é NULL */
  98.     (*t)->sad = NULL; /* Subárvore à direita é NULL */
  99.     (*t)->num = num; /* Armazena a informação */
  100.   } else {
  101.     if(num < (*t)->num) /* Se o número for menor então vai pra esquerda */
  102.     {
  103.       /* Percorre pela subárvore à esquerda */
  104.       insertTree(&(*t)->sae, num);
  105.     }
  106.     if(num > (*t)->num) /* Se o número for maior então vai pra direita */
  107.     {
  108.       /* Percorre pela subárvore à direita */
  109.       insertTree(&(*t)->sad, num);
  110.     }
  111.   }
  112. }
  113.  
  114. /* Função que verifica se um elemento pertence ou não à árvore */
  115. int isInTree(Tree* t, int num) {
  116.  
  117.   if(treeIsEmpty(t)) { /* Se a árvore estiver vazia, então retorna 0 */
  118.     return 0;
  119.   }
  120.  
  121.   /* O operador lógico || interrompe a busca quando o elemento for encontrado */
  122.   return t->num==num || isInTree(t->sae, num) || isInTree(t->sad, num);
  123. }
  124.  
  125. void noIntTree(Tree* t, int cont, contador *p) {
  126.  
  127.   if(!treeIsEmpty(t)) /* se a árvore não for vazia... */
  128.   {
  129.     /* Mostra os elementos em pré-ordem */
  130.     if(t->sad!=NULL||t->sae!=NULL){
  131.     printf("%d ", t->num); /* mostra a raiz */  
  132.     p->conta++;
  133.     cont++;
  134.   }
  135.     noIntTree(t->sae,cont, p); /* mostra a sae (subárvore à esquerda) */
  136.     noIntTree(t->sad,cont , p); /* mostra a sad (subárvore à direita) */
  137.   }
  138.  
  139.  
  140. }
  141.  
  142.  
  143.  
  144. int main()
  145. {
  146.   Tree* t = createTree(); /* cria uma árvore */
  147.   contador c;
  148.   iniciacontador(&c);
  149.  
  150.   int op,n,cont=0;
  151.  
  152.   while (1){
  153.     printf ("\n Menu");
  154.     printf ("\n 1. Insere");
  155.     printf ("\n 2. Exibe PRE-FIXADO ");
  156.     printf ("\n 3. Exibe INFIXADO ");
  157.     printf ("\n 4. Exibe POS-FIXADO ");
  158.     printf ("\n 5. Verifica se numero esta na arvore ");
  159.     printf ("\n 6. Verifica arvore vazia ");
  160.     printf("\n 7. Sair");
  161.     printf ("\n\n Entre a sua opcao: ");
  162.     scanf ("%d",&op);
  163.     fflush(stdin);
  164.     if(op==1){
  165.     scanf("%d", &n);
  166.     insertTree(&t, n);
  167.   }
  168.   else if(op==2){
  169.     preordem(t);
  170.   }
  171.   else if(op==3){
  172.     inordem(t);
  173.   }
  174.   else if(op==4){
  175.     posordem(t);
  176.   }
  177.   else if(op==5){
  178.     scanf("%d", &n);
  179.     if(isInTree(t, n)) { /* Verifica se o número 22 pertence a árvore */
  180.         printf("\nO numero %d pertence a arvore!\n\n", n);
  181.     }
  182.    
  183.     else {
  184.        printf("\nO numero %d NAO pertence a arvore!\n\n", n);
  185.     }
  186.   }
  187.   else if(op==6){
  188.     if(treeIsEmpty(t)) /* Verifica se a árvore está vazia */
  189.     {
  190.       printf("\n\nArvore vazia!!\n");
  191.     } else {
  192.       printf("\n\nArvore NAO vazia!!\n");
  193.     }
  194.   }
  195.   else if(op==7){
  196.     noIntTree(t,cont, &c);
  197.     cout<<endl;
  198.     cout<<"Numero de nós internos: "<<c.conta<<endl;
  199.   }
  200.   else if(op==8){
  201.     break;
  202.   }
  203.   }
  204.    
  205.   free(t); /* Libera a memória alocada pela estrutura árvore */
  206.  
  207.   return 0;
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement