二叉排序树的删除函数

一.思路

1.判断ptree,ptree->root是否为空

2.判断树中是否存在待删除的数字

3.删除叶子

4.删除单分支

5.删除双分支(狸猫换太子,找到直接后继,直接后继可能为叶子或单分支)

二.图示

三.代码实现

bool Remove(BSTree* ptree, KeyType key)
{
	assert(NULL != ptree);
	if (ptree->root == NULL)return false;
	BstNode* p = FindValue(ptree, key);
	if (NULL == p)return false;
	//删除双分支
	if (p->leftchild != NULL && p->rightchild != NULL)
	{
		BstNode* pnx = Next(p);//找到直接后继
		p->key = pnx->key;
		p = pnx;//p为单分支或叶子
	}
	//删除叶子,单分支,根节点
	BstNode* pa = p->parent;
	BstNode* child =( p->leftchild!=NULL)?p->leftchild:p->rightchild;
	if (NULL != child)child->parent = pa;
	if (NULL == pa)
	{
		ptree->root = child;
	}
	else
	{
		if (pa->leftchild == p)
		{
			pa->leftchild = NULL;
		}
		else
		{
			pa->rightchild = NULL;
		}
	}
	
	Freenode(p);
	ptree->cursize -= 1;
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值