我创建了一个类二叉搜索树
但问题是当我打印树时它会崩溃
我认为它可以是函数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 :(得分: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
已损坏。如果curr
为NULL
,则会创建一个新节点,但它实际上从未将其添加到现有树中。因此,您所做的所有添加都会被有效忽略,并且树会保持空白。
inorder
功能取消引用curr
,而不检查它是NULL
,print
是否调用它而不检查root
是否为NULL
。因此,您的崩溃很可能是由于tryin打印出一个空树然后取消引用空指针引起的。