删除BST节点导致seg故障.处理步骤
Deleting a node in a Binary Search Tree(BST) is causing seg faults
我在从BST中删除节点时遇到了麻烦,我似乎找不到segfault的罪魁祸首。我测试了BST的其他部分,它运行得很顺利。我也试过删除不同条件的节点,但结果都是一样的。
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;
每行后
delete current_node_;
在删除函数。
相关文章:
- 警告处理为错误这里有什么问题
- 分段故障(堆芯转储)矢量
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- C++中的动态铸造故障
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 数组的指针从不分段故障
- 正在处理故障(堆芯转储)
- C++网络 IO、文件处理和网络故障
- 如何处理分割故障:11 C OSX
- 处理2D数组时的分割故障
- 当程序遇到故障时,如何在信号处理函数中写入日志和上传日志到MYSQL
- 谁处理C++ "new"内存分配故障?
- 来自 ARM 皮层 M0 NRF51822 上的硬故障处理程序的 GDB 回溯
- 如何处理inet_ntop()故障
- MongoDB C++驱动程序处理副本集连接故障
- C++处理文本文件中的分段故障11
- 在C++中多次处理分段故障
- 删除BST节点导致seg故障.处理步骤
- 我很难理解如何处理我的OMP程序中的heisenbug段故障