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

说明

本篇文章为博主对实现平衡二叉树的各种算法的补充,以下代码为平衡二叉树的删除算法的实现。
参考文章: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(edata)//左子树中继续查找
	{
		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;
}

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

你可能感兴趣的:(实现平衡二叉树的删除算法)