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

How do I delete a node from a binary search tree

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

如何实现函数以从二进制搜索树中删除节点?以下是我当前功能:

    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

当下我觉得自己非常接近,但是当我去输出二进制树的内容时,程序会崩溃。我正在尝试使用一种方法,如果节点有两个孩子,我找到了秩序的继任者,请交换"删除"的顺序连续节点和节点的值,然后删除后继者。没有调整remove函数,我缺少哪些信息来使makeDeletion函数如所述工作?

编辑:在makeDeletion功能中,我误编写了两个if语句。第二个if语句应该是else if语句。

makeDeletion中,如果 tree是叶子( leftright均为 NULL),则删除叶子节点,并且不设置 tree = nullptr。这给您的树中的悬挂夹引用了已释放的记忆。另外,然后您在下一个if中取消(现在已删除的)节点。其中任何一个都可以导致您的崩溃。