1 最小失衡树的概念
最小失衡子树:在新插入的节点向上查找,以第一个平衡因子的绝对值超过 1 的节点为根的子树称为最小不平衡子树。也就是说,一棵失衡的树,是有可能有多棵子树同时失衡的。而这个时候,我们只要调整最小的不平衡子树,就能够将不平衡的树调整为平衡的树。
在动图中,以节点 66 为根节点的那颗树就称为 最小失衡子树。
![](https://i-blog.csdnimg.cn/blog_migrate/e5b61f777a44e0d764fe4ccda42e61f3.gif)
2 对节点的两种操作(是对节点的操作,不是对树)
2.1 左旋
![](https://i-blog.csdnimg.cn/blog_migrate/c7e1033e9f0e183fadeb7a6557b8f90b.jpeg)
左旋步骤如下(以下图为例):
当前操作节点是66 (66这个节点是最小失衡树的根节点)
断开该节点的右孩子连接线 (此时变成了两棵树,设以66为根节点的树为原根树,以77为根节点的树为新根树)
判断新根树的根节点的左子树是否为空
若空,直接把原根树作为新根树的左子树。
若不空:
将新根树的根节点的左子树独立出来,设其名为新原独树。
把新原独树作为原根树的右子树。
把原根树作为新根树的左子树。
动态步骤如下:
![](https://i-blog.csdnimg.cn/blog_migrate/a2e46735aad854bba2940e952e3115a4.gif)
2.2 右旋
左旋步骤如下(以下图为例):
![](https://i-blog.csdnimg.cn/blog_migrate/577932ccbb0c801a2cfed7aad69ecdb0.png)
当前操作节点是A (A这个节点是最小失衡树的根节点)
断开该节点的根节点的左孩子连接线 (此时变成了两棵树,设以A为根节点的树为原根树,以B为根节点的树为新根树)
判断新根树的根节点的右子树是否为空
若空,直接把原根树作为新根树的右子树。
若不空:
将新根树的根节点的右子树独立出来,设其名为新原独树。
把新原独树作为原根树的左子树。
把原根树作为新根树的右子树。
动态步骤如下:
![](https://i-blog.csdnimg.cn/blog_migrate/c8a54a34a87c30c685acf39e268eae11.gif)
3 平衡二叉树四种插入节点的方式
3.1 LL
对最小失衡树的根节点实行一次右旋即可
3.2 RR
对最小失衡树的根节点实行一次左旋即可
3.3 LR
![](https://i-blog.csdnimg.cn/blog_migrate/1f6aee91494a146f68447ca3d717986a.jpeg)
步骤如下:
对最小失衡树的根节点的左孩子(节点B)实行一次左旋,得到下图,
![](https://i-blog.csdnimg.cn/blog_migrate/bb91706590deebe5412460b346a09ac7.jpeg)
再对最小失衡树的根节点(节点A)(!!!当前的最小失衡树概念基于最初的树,不是已经经过左旋的树!!!)实行一次右旋,成功恢复平衡。
![](https://i-blog.csdnimg.cn/blog_migrate/cc7c57467756442004357772ad5d556b.jpeg)
3.4 RL
![](https://i-blog.csdnimg.cn/blog_migrate/02cceb6062a33c54310facfa6c58d9a1.jpeg)
步骤如下:
对最小失衡树的根节点的右孩子(节点C)实行一次右旋,得到下图
![](https://i-blog.csdnimg.cn/blog_migrate/ecb8635efb6f594dfffd35665fc970ef.jpeg)
再对最小失衡树的根节点((节点A)(!!!当前的最小失衡树概念基于最初的树,不是已经经过右旋的树!!!))实行一次左旋,成功恢复平衡。
![](https://i-blog.csdnimg.cn/blog_migrate/0c14750e1ac223f26df93e1075caaa18.jpeg)
————————————————
版权声明:本文为CSDN博主「弓长家罗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_51069940/article/details/119701083