您的位置:首页 > 其它

二叉查找树又来了,该死而复杂的删除操作

2017-03-06 15:43 197 查看
二叉查找树的删除操作很复杂,而且要考虑的情况较多,在算法导论这本书上分为三种情况来讨论:

首先根据给定的val值找到相对应的节点:

1.如果该节点既没有左子树,也没有右子树,直接进行删除操作就好,(三种情况中最为简单的一种)

2.如果该节点只有左子树或者右子树,则可以通过其子节点和父节点间建立一条链来删除该节点

3.如果该节点既有左子树又有右子树,首先要删除当前节点的后继节点m(大于当前节点中最小的节点),再用m节点代替当前节点

正所谓无图无真相啊,来把算法导论上图盗过来用一下再说

1


2


3


对应上面所述三种情况

看一下实现的代码:

//下面函数是为了以防该节点的右孩子不为NULL时,需要找到右子树的最小值来获取后继节点
TreeNode* getNextNode(TreeNode* root)
{
if (NULL == root)
return root;
while (root->left)
{
root = root->left;
}
return root;
}
//找到该节点的后继节点
void TreeDelete(int val, TreeNode* root)
{
TreeNode* node = root;
TreeNode* parent = NULL;
while (cur)
{
parent = cur;
if (cur->val == val)
break;//最幸运,一找就找到
else if (cur-> > val) //该点在左子树的位置
{
cur = cur->left;
}
else
{
cur = cur->right;
}
}
//以上操作找到了该点
if (NULL == node)
{
return ;
}
//节点为空
if (!node->left && !node->right)//左右子树都没有,好像很开心的样子
{
delete node;
return ;//直接干掉
}
//左右子树都有整个人就不好了
if (node->left && node->right)
{
//首先找到node节点的后继节点,就是右子树中val最小节点
TreeNode* next = getNextNode(node->right);//没错了,就是后继节点了
int newVal = next->val;
TreeDelete(next->, root);//删除后继节点,
node->val =newVal; //对当前节点值进行替换
}
else
{
//只有左子树或者右子树
TreeNode* child = node->left?node->left:node->right;
if (parent->left == node) //左子树
{
parent->left = child;
}
else //右子树
{
parent->right = child;
}
delete node;
node = NULL;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: