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

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

首先根据给定的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;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值