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

时间:2015-04-13 04:00:32

标签: c++ binary-search-tree

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

这是我的代码:

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

1 个答案:

答案 0 :(得分:0)

删除包含2个孩子的节点x的正确方法是找到successor的{​​{1}}或predecessor,替换x' s值包含xpredecessor的值,并在其中任何一个上调用删除(无论您使用哪个)。

您在这里使用successor。你在做什么

predecessor

将父节点左侧指向叶节点(parent->left = minLeaf; 节点),导致其间的所有节点都消失。相反,你应该做的是

predecessor

并递归调用temp->data = minLeaf->data; 上的删除。