实现平衡二叉树的删除算法

说明

本篇文章为博主对实现平衡二叉树的各种算法的补充,以下代码为平衡二叉树的删除算法的实现。
参考文章:https://blog.csdn.net/sysu_arui/article/details/7897017

具体代码实现

bool DeleteAVL(BiTree &T,int e,bool &flag)//删除结点并调整
{
	if(T==NULL)//根结点不存在
	{
		return false;//删除失败
	}
	else if(e==T->data)//找到需要删除的结点
	{
		BiTNode *q=NULL;
		if(T->lchild==NULL)//左子树为空
		{
			q=T;
			T=T->rchild;
			delete q;
			flag=true;
		}
		else if(T->rchild==NULL)//右子树为空
		{
			q=T;
			T=T->lchild;
			delete q;
			flag=true;
		}
		else//左右子树均存在
		{
			q=T->lchild;
			while(q->rchild)
			{
				q=q->rchild;
			}
			T->data=q->data;
			DeleteAVL(T->lchild,q->data,flag);//在左子树中递归删除前驱结点
		}
	}
	else if(e<T->data)//左子树中继续查找
	{
		if(!DeleteAVL(T->lchild,e,flag))
		{
			return false;
		}
		if(flag)
		{
			switch(T->bf)
			{
				case LH:
					T->bf=EH;
					flag=true;
					break;
				case EH:
					T->bf=RH;
					flag=false;
					break;
				case RH:
					RightBalance(T);//右平衡处理
					if(T->rchild->bf==EH)
						flag=false;
					else
						flag=true;
					break;
			}
		}
	}
	else//右子树中继续查找
	{
		if(!DeleteAVL(T->rchild,e,flag))
		{
			return false;
		}
		if(flag)
		{
			switch(T->bf)
			{
				case LH:
					LeftBalance(T);//左平衡处理
					if(T->lchild->bf==EH)
						flag=false;
					else
						flag=true;
					break;
				case EH:
					T->bf=LH;
					flag=false;
					break;
				case RH:
					T->bf=EH;
					flag=true;
					break;
			}
		}
	}
	return true;
}

本篇文章仅是本人在学习平衡二叉树删除结点过程中的算法总结,如果有什么错漏的地方,敬请谅解。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值