Printing binary tree graphically in C

Asked

Viewed 1,026 times

0

Last week I was working on this code that prints binary tree graphically but I didn’t understand very well its way of using or if there is a bug because I type in the amount of nodes and the algorithm is processing and doesn’t 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 inmprime a tree graphically i.e.:

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

This would be: (15(13(9(6()))(14()))(25(17())(28(27())(31()))))

What’s wrong with this algorithm?

  • Select all the code and put to stay in code mode to be legible, so it is difficult to give an answer

  • but it’s all the code that’s there

  • Yes I know, but it was not selected as whole code, a part was as text

1 answer

1


Looking quickly, I found the following errors:

  • The functions planta_tree and inserts should be void because one already receives a pointer and the variable to which it points already modifies the main variable.
  • In addition, the variable tree must be of type no and not a pointer to no.
  • if(tree == NULL); makes no sense.
  • I would also change the way I create the tree to:

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

      bool esta_empty(in tree) {

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

      }

    Follow the changed code:

    typedef struct notomar given int; struct no *sub_left_tree; struct no *sub_right_tree; }no;

    void planta_tree(no *tree)' tree->given = -1; tree->sub_tree left_null = NULL; tree->sub_tree right_null = NULL; }

    bool esta_empty(in the tree) ' Return tree.sub_treeleft_== NULL && tree.sub_treeright_== NULL; }

    no * inserts(int info, in *tree)' if(tree == NULL){ tree = (no *)malloc(sizeof(no)); tree->given = info; tree->left tree = NULL; tree->right tree= NULL; Return(tree); } if(info < tree->given){ printf("%d inserted on the left", tree->given); tree->sub_left tree=insert(info,tree->sub_left tree); Return(tree); } if(info > tree->given){ printf("%d inserted on the right", tree->given); tree->right tree=insert(info,tree->right tree); Return(tree); } Else Return NULL; }

    int main() in the tree; int given; int Ret,i; printf("how many do we have the tree? " ); scanf("%d",&Ret); printf(" n"); planta_tree(&tree); for(i=0; i

  • I changed the function planta_tree to void and modified it but it returns me the following error: void value not Ignored as it ought to be tree = planta_tree(tree); and if I go back to no* as it was modified from Segmentation falt.

  • Your main tree variable should not be pointer, so when calling the method, you should use planta_tree(&tree) and you should not store the result because it returns nothing (is void).

  • And in the method, you need to declare with pointer: void planta_tree(no *tree){

  • so this is exactly how this https://pastebin.com/dNH3HcHd

  • I put the code I changed in the code, but it didn’t format right.

  • Now you need to check if it’s working and implement the pre-order.

  • Managed to implement?

  • according to the creator of the algorithm not because he was to print in the style of a tree and did not..

Show 3 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.