说明
本篇文章为博主对实现平衡二叉树的各种算法的补充,以下代码为平衡二叉树的删除算法的实现。
参考文章: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;
}
本篇文章仅是本人在学习平衡二叉树删除结点过程中的算法总结,如果有什么错漏的地方,敬请谅解。