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

记录在学习《大话数据结构》过程中,对平衡二叉树的旋转操作函数LeftBalance的理解。
在这里插入图片描述
具体情形如下:
在这里插入图片描述
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;

猜你喜欢

转载自blog.csdn.net/weixin_40315481/article/details/107856484