如何从二叉搜索树中删除节点

时间:2017-12-05 03:40:19

标签: c++

如何实现从二叉搜索树中删除节点的功能?以下是我目前的职能:

    void makeDeletion(TreeNode *&tree) {
    TreeNode *NodeToDelete;
    NodeToDelete = tree;
    TreeNode *InOrder;

    if (tree->right == NULL && tree->left == NULL) {
        delete NodeToDelete;
    }
    if (tree->right == NULL) {
        tree = tree->left;
        delete NodeToDelete;
    }
    else if (tree->left == NULL) {
        tree = tree->right;
        delete NodeToDelete;
    }
    else {
        InOrder = tree->right;
        while (InOrder->left != NULL) {
            InOrder = InOrder->left; 
        }

        NodeToDelete->value = InOrder->value;
        remove(InOrder, InOrder->value);
    }
}

这是我所拥有的remove函数,用于定位要删除的值:

    void remove(TreeNode *&tree, ANY num) {//Removed Need for ">"
    if (tree == NULL){
        return;
    }

    if (tree->value == num) {
        makeDeletion(tree);
    } else if (num < tree->value) {
        remove(tree->left, num);
    } else {
        remove(tree->right, num);
    }
};//Remove

目前我觉得我非常接近,但是当我输出二叉树的内容时,程序崩溃了。我试图使用一种方法,其中,如果节点有两个子节点,我找到顺序后继,交换顺序后继节点和节点的节点值被删除,&#34;然后删除顺序后继。在不调整remove函数的情况下,我遗漏了哪些信息以使makeDeletion函数按照描述工作?

编辑:在makeDeletion函数中,我错误地连续写了两个if语句。第二个if语句应该是else if语句。

1 个答案:

答案 0 :(得分:0)

makeDeletion中,如果tree是一个叶子(leftright都是NULL),则删除叶节点,而不是设置tree = nullptr。这会在您的树中留下已释放的内存中的悬空引用。此外,您然后在下一个if中取消引用(现在已删除)节点。其中任何一个都可能导致您的崩溃。