Printing binary tree graphically in C

0

Last week I was working on this code that prints binary tree graphically but I did not quite understand how to use it or if it has a bug because I type the number of nodes and the algorithm keeps processing and does not print.

#include <stdio.h>
#include <stdlib.h>

typedef struct informacao{ //
   int valor;
}informacao;

typedef struct no{
   informacao dado;
   struct no *sub_arvore_esquerda;
   struct no *sub_arvore_direita;
}no;


no * planta_arvore(no *arvore){
   arvore = NULL;
   return(arvore);
}

no * insere(informacao info, no *arvore){
   if(arvore == NULL){
      arvore = (no *)malloc(sizeof(no));
      arvore->dado = info;
      arvore->sub_arvore_esquerda = NULL;
      arvore->sub_arvore_direita= NULL;
      return(arvore);
   }
   if(info.valor < arvore->dado.valor){
       printf("%d inserido na esquerda",arvore->dado.valor);
      arvore->sub_arvore_esquerda=insere(info,arvore->sub_arvore_esquerda);
      return(arvore);
   }
   if(info.valor > arvore->dado.valor){
       printf("%d inserido na direita", arvore->dado.valor);
      arvore->sub_arvore_direita=insere(info,arvore->sub_arvore_direita);
      return(arvore);
   }
   else
      return NULL;
}

int imprime_pre_ordem(no *arvore)
{/// a função ultilizada foi a pre-ordem pois imprime primeiro a raiz, depois segue pela esquerda e depois pela direita 
   int a=1,b=1;
   if(arvore != NULL){
      printf("(");
      printf("%d",arvore->dado.valor);
      a=imprime_pre_ordem(arvore->sub_arvore_esquerda);///a==0 caso sub_arvore_esquerda==NULL
      b=imprime_pre_ordem(arvore->sub_arvore_direita);///a==0 caso sub_arvore_direita==NULL
      if(b==0 && a==0)printf("()");///imprime  () se e somente se encontrar um nó folha
      else if(b==0 && a!=0);///isso acontece se encontrar um nó com a perna direita null
      else if(b!=0 && a==0);///isso acontece se encontrar um nó com a perna esquerda null

     /**Observações:
     Existem tambem mais dois casos:
     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:
     */
     if(b==0 && a!=0)printf("()");
     if(b!=0 && a==0)printf("()");

     /* 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:
      */

     if(b==0)printf("()");
     if(a==0)printf("()");

     /* That's All Folks! (É só isso pessoal!) */
      printf(")");///fecha a representação de uma raiz
   }else return 0;//retorna 0 caso arvore == NULL 
}
//         testes realizados:
//  caso ativado: (15(13(9(6()))(14()))(25(17())(28(27())(31()))))
//  1° caso: (15(13(9(6()())())(14()()))(25(17()())(28(27()())())))
//  2° caso: (15(13(9(6)())(14))(25(17)(28(27)())))
/*
void imprimir(no *arvore){
    printf("(");
    if(arvore == NULL)
        printf("-1"); // imprime -1 se encontrar um no folha
    else{
        printf("%d", arvore->dado.valor);
        imprimir(arvore->sub_arvore_esquerda);
        imprimir(arvore->sub_arvore_direita);
    }
    printf(")");
}
*/
int main()
{
   no *arvore,
   *arv,
   *arv2;
   informacao dado;
   int ret,i;
   printf("quantos nos tem a arvore? ");
   scanf("%d",&ret);
   printf("\n");
   arvore = planta_arvore(arvore);
   for(i=0;i<ret;i++){
      scanf("%d",&dado.valor);
      arvore = insere(dado,arvore);
      if(arvore == NULL);
   }
//     printf("\nEm ordem :");
   imprime_pre_ordem(arvore);
   printf("\n");
}

This program prints a tree graphically ie:

         15
       /    \
     13      25
     /\     / \
    9 14   17 28
   /          / \
  6          27 31
  

It would look like this: (15 (13 (9 (6 ()) (14 ())) (25 (17)) (28 (27)) (31)

What is the problem with this algorithm?

    
asked by anonymous 19.09.2017 / 12:36

1 answer

1

Looking quickly, I encountered the following errors:

  • The plant-tree and insert functions should be void because a pointer is already given and the variable it points to modifies the main variable.
  • In addition, the tree variable must be of type no and not a pointer to no.
  • if (tree == NULL); does not make sense.
  • I would also change how to create the tree for:

       void planta_arvore(no *arvore){
    
         arvore->dado.valor = -1;   
         arvore->sub_arvore_esquerda = NULL;   
         arvore->sub_arvore_direita = NULL;   
       }
    
    • And would create a function to test if the tree is empty:

      bool esta_vazia (in the tree) {

      return arvore.sub_arvore_esquerda == NULL && arvore.sub_arvore_direita == NULL;
      

      }

    Follow the changed code:

    typedef struct no {int given; struct no * sub_arvore_desquerda; struct in * sub_arvore_right; } no;

    void plant_tree (in * tree) {tree-> given = -1; tree-> sub_arvore_desquerda = NULL; tree-> sub_arrow_right = NULL; }

    bool esta_vazia (in the tree) {return arvore.sub_arvore_desquerda == NULL & arvore.sub_arvore_direita == NULL; }

    no * insert (int info, no * tree) {if (tree == NULL) {       tree = (no *) malloc (sizeof (no));       tree-> given = info;       tree-> sub_arvore_desquerda = NULL;       tree-> sub_arrow_right = NULL;       return (tree); } if (info- given) {        printf ("% d inserted in left", tree-> given);       tree-> sub_arvore_left = insert (info, tree-> sub_tree_left);       return (tree); } if (info > tree-> given) {        printf ("% d inserted in the right", tree-> given);       tree-> sub_arrow_right = insert (info, tree-> sub_arrow_right);       return (tree); } else       return NULL; }

    int main () {in the tree;        int data; int ret, i; printf ("How many does the tree have?"); scanf ("% d", & ret); printf ("\ n"); plant_tree (& tree); for (i = 0; i

20.09.2017 / 02:52