为什么我不能打印二叉树?

Why can't i print binary tree?

本文关键字:二叉树 打印 不能 为什么      更新时间:2023-10-16

我创建了一个类二叉搜索树。
但问题是,当我打印树时,它崩溃了。
我认为它可以是一个无穷递归函数print()。

我的代码

struct node{
node *l,*r;
int data;
};
class BinTree
{
  private:  node *root;
  public:
   BinTree(){ root=NULL; }
   void add(int a){ add_node(a,root); };
   void add_node(int a, node *rot)
   { node *curr; curr=rot;
       if(curr==NULL)
       {
           curr=new node;
           curr->data=a;
           curr->l=NULL;
           curr->r=NULL;
           return;
       }
       if(a>=curr->data)   curr=curr->r,add_node(a,curr);
       if(a<curr->data)    curr=curr->l,add_node(a,curr);
   }
   void print(){ inorder(root); }
   void inorder(node *curr)
   {
     if(curr->l!=NULL)   inorder(curr->l);
     cout<<curr->data<<" ";
     if(curr->r!=NULL)   inorder(curr->r);
   }
};


有人能帮我吗?

在您的add_node方法中,您从未实际将值分配给根。应该是这样的:

if(curr==NULL) 
{ 
    curr=new node; 
    curr->data=a; 
    curr->l=NULL; 
    curr->r=NULL; 
    root = curr;
    return; 
} 

但是,对于将来,我有与Basile相同的建议-使用您的编译器和调试器。

您的add_node坏了。如果currNULL,它会创建一个新节点,但不会将其添加到现有树中。因此,您所添加的所有内容都将被有效地忽略,并且树将保持为空。

inorder函数取消引用curr而不检查是否为NULL, print调用root而不检查NULL。因此,您的崩溃很可能是由于试图打印一个空树,然后解引用一个空指针引起的。

学习如何使用调试器在编译器中启用所有警告。

在Linux上,这意味着用g++ -Wall -g编译,用gdb调试