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

时间:2011-12-05 06:55:11

标签: c++ class binary-tree

我创建了一个类二叉搜索树 但问题是当我打印树时它会崩溃 我认为它可以是函数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);
   }
};


任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:4)

add_node方法中,您实际上从未为根分配值。它应该是这样的:

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

您的add_node已损坏。如果currNULL,则会创建一个新节点,但它实际上从未将其添加到现有树中。因此,您所做的所有添加都会被有效忽略,并且树会保持空白。

inorder功能取消引用curr,而不检查它是NULLprint是否调用它而不检查root是否为NULL。因此,您的崩溃很可能是由于tryin打印出一个空树然后取消引用空指针引起的。