二叉搜索 删除目标节点的树有两个子节点

Binary Search Tree deletion of target node has two children

本文关键字:子节点 两个 搜索 删除 目标 节点      更新时间:2023-10-16

这是我的代码,替换是正确的(用左子树中最大的节点替换目标节点),但是替换后,左右子树都消失了。

这是我的代码:

else if (temp->left != NULL && temp->right != NULL)
    {
        minLeaf = temp->left;
        minLeafMa = temp->left;
        parentRight = parent->right;
        while (minLeaf->right != NULL)
        {
            minLeafMa = minLeaf;
            minLeaf = minLeaf->right;
        }
        if (parent->left == temp)
        {
            parent->left = minLeaf;
            minLeafMa->right = NULL;
        }
        else if (parent->right == temp)
        {
            parent->right = minLeaf;
            minLeafMa->right = NULL;
        }
    }

删除具有 2 个子节点x的正确方法是找到x的无序successorpredecessor,将x的值替换为predecessorsuccessor的值,并对其中任何一个调用删除(无论您使用哪个)。

您在此处使用predecessor。你正在做

parent->left = minLeaf;

它将父节点的左侧指向叶节点(predecessor节点),导致两者之间的所有节点都消失。相反,你应该做的是

temp->data = minLeaf->data;

并在minLeaf上递归调用删除。