2011-12-05 112 views
0

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


谁能帮助我?

+0

至少肯定会在root为NULL时崩溃 – onemach

+1

我看到两个问题:第一个是什么让你的程序崩溃,如果你在调试器中运行该程序会很明显。另一个是你永远不会为你的树添加节点,使用调试器来遍历'add_node'来查看原因。 –

回答

2

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

inorder函数指针引用curr没有检查是否是NULL,并print调用它,而不检查root是否NULL。因此,你的崩溃很可能是由于尝试打印出一棵空树,然后解引用一个空指针而引起的。

2

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

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

4

在你的add_node方法中,你永远不会真的为根分配一个值。它应该是这样的:

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

但是,对于将来,我有与巴西尔相同的建议 - 使用你的编译器和调试器到你的优势。