我正在尝试编写代码以迭代地在BST中插入新元素。当我尝试执行代码时,我得到一个段错误。有人可以查看代码并帮我纠正吗?
bool insert2(int item)
{
BstNode *parent;
BstNode *root=new BstNode;
cout<<root->data;
cout<<"\n";
BstNode *ptr;
int ctr=0;
//cout<<root->data;
if (root==NULL)
{
BstNode *temp=new BstNode;
temp->data=item;
temp->left=NULL;
temp->right=NULL;
root=temp;
//cout<<root->data;
return true;
}
else
{
ptr=root;
while (ptr!=NULL)
{
ctr=ctr+1;
cout<<ctr;
if (ptr->data==item)
{
cout<<ptr->data;
return false;
}
if (item < ptr->data)
{
parent=ptr;
ptr=ptr->left;
}
else
{
parent=ptr;
ptr=ptr->right;
}
}
BstNode *add=new BstNode;
add->data = item;
add->left= NULL;
add->right= NULL;
return true;
}
}
编辑出root-&gt;数据部分,代码将进入第一个if块并返回true,这让我猜测我的问题出在减速的某个地方。
答案 0 :(得分:0)
有很多事情你做错了。首先,正如PaulMcKenzie指出的那样,你不应该在函数的开头创建根。如果BST没有开始为空,则根目录已经存在,您不想创建新的。相反,root应该是一个公共变量(只允许你有一个BST),或者该函数应该将指向root的指针作为参数之一。您创建根然后测试它以查看它是否为NULL当然没有意义。除非你内存不足,否则在你创建它之后就不会是NULL。
您的代码的另一个问题是,在BST中找到适当的位置后,您将创建新节点,但不要将其附加到树中。相反,您可能希望在初始化add
之后插入以下行:
if(item < parent->data)
parent->left = add;
else
parent->right = add;
每次调用函数时都会出现seg-fault,这可能是因为,当您声明root
时,您不会初始化其right
和{{1指向NULL的指针。因此,while循环在到达left
或root->left
时不会停止。当您尝试在循环中稍后使用root->right
时,您将引用未初始化的指针,从而导致seg-fault。