这是我的代码,替换是正确的(用左子树中最大的节点替换目标节点),但在替换后,左右子树都消失了。
这是我的代码:
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;
}
}
答案 0 :(得分:0)
删除包含2个孩子的节点x
的正确方法是找到successor
的{{1}}或predecessor
,替换x
' s值包含x
或predecessor
的值,并在其中任何一个上调用删除(无论您使用哪个)。
您在这里使用successor
。你在做什么
predecessor
将父节点左侧指向叶节点(parent->left = minLeaf;
节点),导致其间的所有节点都消失。相反,你应该做的是
predecessor
并递归调用temp->data = minLeaf->data;
上的删除。