尝试从二叉搜索树中删除节点

时间:2015-09-22 04:22:54

标签: c++ null binary-search-tree

我在删除节点后尝试显示树时出现内存错误。
这是我的删除(删除)方法:

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;
}

我的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的节点因为它有两个孩子。

1 个答案:

答案 0 :(得分:1)

当您删除节点时,您需要将指向它的指针清空,在您的示例中可以是root,previous-&gt; left或previous-&gt; right。如果您将之前的内容更改为<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/5.5.2/js/foundation.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/5.5.2/js/foundation/foundation.orbit.min.js"></script> <script src="script.js"></script> <!-- Add --> 并将其指向上一个指针(初始化为&amp; root),则可以说node ***previous = null