《大话数据结构》平衡二叉树,LeftBalance平衡因子的调整过程

记录在学习《大话数据结构》过程中,对平衡二叉树的旋转操作函数LeftBalance的理解。

void LeftBalance(BiTree *T);

该函数作用是调整失去平衡的T子树,使其恢复平衡。如果LeftBalance被调用,此时T满足:

  • 插入新节点前,T的根节点的平衡因子为1
  • 插入新节点后,T的左子树高度大于右子树高度

具体情形如下:
在这里插入图片描述

case分析
1. case LH

检查T的左子树L的高度,发现左子树L是LH时,由于是递归回溯的过程,因此左子树L的LH是由于新插入的节点插入到L的左子树上导致的。但是插入新节点后L仍然是平衡的。具体过程如下:
在这里插入图片描述
因此旋转后调节平衡因子为
(*T)->bf = L->bf = EH
然后对T进行右旋。

2 .case RH

检查T的左子树L的高度,发现左子树L是RH时,由于是递归回溯的过程,因此左子树L的RH是由于新插入的节点插入到L的右子树上导致的。但是插入新节点后L仍然是平衡的。具体过程如下:
在这里插入图片描述
为了调整平衡因子,此时还要对L的右子树Lr的高度进行分类讨论,即第2个switch语句中的3个case

2.1 case LH

插入新节点导致Lr的左子树高度大于右子树高度,但Lr仍然是平衡的。插入过程如下:
在这里插入图片描述
进行旋转后,变化如下:
在这里插入图片描述
因此平衡因子的修改为:
(*T)->bf = RH;
L->bf = EH;
Lr->bf = EH;

2.2 case EH

插入新节点导致Lr的左子树高度与右子树高度相等,在这种情况下L的右子树本来为空,即Lr即是新插入的节点。
假设L的右子树不为空,即n不等于0,情形如下:
在这里插入图片描述
此时Lr肯定有一棵子树高度为n,因为要保证Lr的平衡因子为0,故新节点插入之前,T就是不平衡的,因此与T是由新节点插入导致的失衡矛盾。所以在Lr的平衡因子为EH的情形下,L的右子树原本应该为空,即Lr==A。此时的插入过程如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200807111938834.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_
因此平衡旋转之后的平衡因此调整为:
(*T)->bf = L->bf = EH;
Lr->bf = EH;

2.3 case RH:

插入新节点导致Lr的右子树高度大于左子树高度。插入过程如下:
在这里插入图片描述
进行旋转之后,变化如下:
在这里插入图片描述
因此平衡因子的修改为:
(*T)->bf = EH;
L->bf = LH;
Lr->bf = EH;

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值