[英]Deleting a node in a Binary Search Tree(BST) is causing seg faults
I'm having trouble with removing a node from my BST and I can't seem to find the culprit to my seg faults. 我在从BST中删除节点时遇到了麻烦,而且似乎找不到导致seg错误的元凶。 Every other part of my BST I've tested and it runs smoothly.
我已经测试过BST的所有其他部分,并且运行平稳。 I've also tried deleting nodes with different conditions but it's all the same result.
我也尝试过删除条件不同的节点,但是结果都是一样的。
template <typename object>
bool BST<object>::remove(object& data)
{
if (nodes == 0)
{
return false;
}
else
{
return remove(root_, data);
}
}
template <typename object>
bool BST<object>::remove(node<object>* current_node_, object& data)
{
if (current_node_ == NULL)
{
return false;
}
int relation = compare(data, current_node_->get_data());
//if you need to keep searching right
if (relation > 0)
{
remove(current_node_->get_right(), data);
}
else if (relation < 0)
{
remove(current_node_->get_left(), data);
}
else
{
//LEAF CASE
if (current_node_->is_leaf())
{
//root case
if (compare(root_->get_data(), data) == 0)
{
root_ = NULL;
}
else
{
if (current_node_->is_right_child())
{
current_node_->get_parent()->set_right(NULL);
}
else
{
current_node_->get_parent()->set_left(NULL);
}
}
//release from memory
delete current_node_;
nodes--;
}
//ONE CHILD CASE
else if (current_node_->has_one_child())
{
//root node
if (compare(root_->get_data(), data) == 0)
{
if (current_node_->get_right() != NULL)
{
current_node_->get_right()->set_parent(NULL);
root_ = current_node_->get_right();
}
else
{
current_node_->get_left()->set_parent(NULL);
root_ = current_node_->get_left();
}
}
//node with right child
else if(current_node_->get_right() != NULL)
{
current_node_->get_right()->set_parent(current_node_->get_parent());
if (current_node_->is_right_child())
{
current_node_->get_parent()->set_right(current_node_->get_right());
}
else
{
current_node_->get_parent()->set_left(current_node_->get_right());
}
}
//node with left child
else
{
current_node_->get_left()->set_parent(current_node_->get_parent());
if (current_node_->is_right_child())
{
current_node_->get_parent()->set_right(current_node_->get_left());
}
else
{
current_node_->get_parent()->set_left(current_node_->get_left());
}
}
//release from memory
delete current_node_;
nodes--;
}
//TWO CHILDREN CASE
else
{
node<object>* temp_node_ = find_min(current_node_->get_right());
object* temp_object_ = new object(temp_node_->get_data());
remove(temp_node_, temp_node_->get_data());
current_node_->set_data(*temp_object_);
}
return true;
}
return false;
}
template <typename object>
node<object>* BST<object>::find_min(node<object>* current_node_)
{
if(current_node_->get_left() != NULL)
{
find_min(current_node_->get_left());
}
else
{
return current_node_;
}
}
Write 写
current_node_=NULL;
After each line 每行之后
delete current_node_;
in remove function. 在删除功能。 Let me inform if its work.
让我告诉它是否有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.