有关AVL树删除操作的一个问题

Neil_Lai_ 2017-05-13 06:33:05
看了一篇很火的AVL树讲解博客http://blog.csdn.net/sysu_arui/article/details/7897017
里面AVL删除操作如下:
/*  
若在平衡的二叉排序树t中存在和e有相同关键字的结点,则删除之
并返回true,否则返回false。若因删除而使二叉排序树
失去平衡,则作平衡旋转处理,布尔变量shorter反映t变矮与否
*/
bool deleteAVL(AVL& t, KeyType key, bool& shorter)
{
if(t == NULL) //不存在该元素
{
return false; //删除失败
}
else if(EQ(key, t->data.key)) //找到元素结点
{
AVLNode* q = NULL;
if(t->lchild == NULL) //左子树为空
{
q = t;
t = t->rchild;
delete q;
shorter = true;
}
else if(t->rchild == NULL) //右子树为空
{
q = t;
t = t->lchild;
delete q;
shorter = true;
}
else //左右子树都存在,
{
q = t->lchild;
while(q->rchild)
{
q = q->rchild;
}
t->data = q->data;
deleteAVL(t->lchild, q->data.key, shorter); //在左子树中递归删除前驱结点
}
}
else if(LT(key, t->data.key)) //左子树中继续查找
{
if(!deleteAVL(t->lchild, key, shorter))
{
return false;
}
if(shorter)
{
switch(t->bf)
{
case LH:
t->bf = EH;
shorter = true;
break;
case EH:
t->bf = RH;
shorter = false;
break;
case RH:
rightBalance(t); //右平衡处理
if(t->rchild->bf == EH)//注意这里,画图思考一下
shorter = false;
else
shorter = true;
break;
}
}
}
else //右子树中继续查找
{
if(!deleteAVL(t->rchild, key, shorter))
{
return false;
}
if(shorter)
{
switch(t->bf)
{
case LH:
leftBalance(t); //左平衡处理
if(t->lchild->bf == EH)//注意这里,画图思考一下
shorter = false;
else
shorter = true;
break;
case EH:
t->bf = LH;
shorter = false;
break;
case RH:
t->bf = EH;
shorter = true;
break;
}
}
}
return true;
}

其中注释 “画图思考”那一段为什么要判断该结点的右边子树是否相等来决定shorter是否为真?就是这一段
 case RH:  
rightBalance(t); //右平衡处理
if(t->rchild->bf == EH)//注意这里,画图思考一下
shorter = false;
else
shorter = true;
break;
}

百思不得其解,我觉得直接右平衡操作就行了。到底是为什么?
...全文
214 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Neil_Lai_ 2017-05-14
  • 打赏
  • 举报
回复
为什么要if判断一下呢?
FancyMouse 2017-05-13
  • 打赏
  • 举报
回复
因为原来右孩子的右子树整体高度-1,原来右孩子的左子树整体高度不变。直接右平衡自己是搞定了,但是shorter需要正确计算出来使得你的父节点能正确处理它的高度。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧