简体   繁体   English

删除二进制搜索树(BST)中的节点会导致seg错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM