试图从二叉搜索树中删除一个节点

Trying to delete a node from a binary search tree

本文关键字:节点 一个 删除 搜索树      更新时间:2023-10-16

当我试图在删除节点后显示我的树时,我得到了内存错误。
这是我的移除(删除)方法:

void binarySearchTree::remove(int x, node * r)
{
    bool found = false;
    node * previous = NULL;
    if (root == NULL)
    {cout << "Tree is empty. Nothing to remove." << endl; return;}
    while (!found)
    {
        if (x < r->data)
        {
            previous = r;
            r = r->left;
        }
        else if (x > r->data)
        {
            previous = r;
            r = r->right;
        }
        else
            found = true;
    }

    if (r->left == NULL && r->right == NULL)        //case 1: node to be deleted is a leaf (no children)
    {
        delete r;
        return;
    }
    else if(r->left == NULL && r->right != NULL)    //case 2: node only has a right child
        previous->right = r->right;
    else if (r->left != NULL && r->right == NULL)   //case 2: node only has a left child
        previous->left = r->left;
    else
    {                                               //case 3: node has two children
        node * minNode = findMinNode(r->right);     //finds min node in the right sub tree
        r->data = minNode->data;
        delete minNode;
        return;
    }
    delete r;
}

My findMinNode方法:

binarySearchTree::node * & binarySearchTree::findMinNode(node * r)
{
    if (r == NULL)      //if tree is empty
        return r;
    if (r->left == NULL && r->right == NULL)
        return r;
    else if (r->left != NULL)
        return findMinNode(r->left);
    else
        return findMinNode(r->right);
}

我的显示方法(使用预购遍历):

void binarySearchTree::display(node * r)
{
    if (r == NULL)
        return;
    display(r->left);
    cout << r->data << endl;
    display(r->right);
}

我正在使用一个公共display()方法,然后调用这个私有display(node * r)方法。

我知道问题是当我使用delete时,因为当我通过代码并得到我的display()方法时,当它检查我刚刚删除的节点上的r== NULL时,地址不是NULL,地址是0x000000000,而是0x000000001。因此,我的程序会崩溃。我以前从未遇到过这个问题。如有任何帮助,我将不胜感激。

我应该补充一下,我插入这些值的顺序是:10、5、34、2、8、12、25、6、18、27、38、11。我试图删除值为12的节点,因为它有两个子节点。

当您删除一个节点时,您需要清空指向它的指针,在您的示例中可以是根、previous->左或previous->右。如果您将previous更改为node **,并将其指向previous指针(初始化为&root),那么您可以只说*previous = null*previous = r->right

相关文章: