我正在尝试创建一个用于删除的bst函数。但是,我正在努力解决这个问题很长时间,但我无法弄清楚导致分段错误的原因。有人可以帮我找一下吗?这是我的代码;
bool Set::remove(const ItemType & item) {
return removeHelper(root, item);
}
bool Set::removeHelper(Node *root, const ItemType &item) {
if (root == NULL) {//check if root is null
return false;
}
else if (item == root->data) {//check if item equals to root
Node *temp = root;
if (root->right == NULL && root->left == NULL) {//check if roots equal to null
root = NULL;
}
else if (root->right == NULL) {//check if root equals to null
root = root->left;
}
else if (root->left == NULL) {//check if root equals to null
root = root->right;
}
else {
Node *p = root; //it is like parent root
temp = temp->right;
while (temp->left != NULL) {//check if temp root equals to null
p = temp;
temp = p->left;
}
if (p == root) {//check if root equals to parent
p->right = temp->right;
}
else {
p->left = temp->right;
}
root->data = temp->data;
}
delete temp;//delete temp node
return true;
}
else if (item < root->data)
removeHelper(root->left, item);//call recursive delete function
else if (item > root->data)
removeHelper(root->right, item);//call recursive delete function
return false;
答案 0 :(得分:2)
您的removeHelper
函数正在为其root
参数分配新值,但这些新值在函数返回时会丢失。如果要更改用于调用removeHelper
函数的变量的值,则应通过引用传递它。
bool Set::removeHelper(Node * &root, const ItemType &item) {
然后对节点指针值的更改将反映在调用函数中。
另请注意,root
是参数的真正错误名称,因为它隐藏了类成员变量root
,这使得阅读非常混乱。我建议将其更改为node
。 e.g:
bool Set::removeHelper(Node * &node, const ItemType &item) {
当然,将所有root
引用更改为node