平衡二叉树

1.定义

任意结点的左、 右子树高度差的绝对值不超过 1,将这样的二叉树称为平衡二叉树 (Balanced
Binary Tree), 或称 AVL 树。 每个结点的左右子树高度差称之为平衡因子,由定义可知,平衡二叉树的平衡因子的值只能是-1、0、1。
为了提高二叉排序树的搜索效率,我们希望二叉树的树高比较小,结点比较多,整体呈现出矮胖的情形。这样能使得最少次数能检索完一颗二叉排序树。由此,把平衡二叉树的思想应用在二叉排序树上,就能把二叉排序树变的矮胖,从而提高检索效率。

2.结点插入

有新结点插入的时候,只需找到最底层的平衡因子“出错”的结点,纠正它,比他高层的结点的平衡因子也平衡了。也即每次调整的都是最小的不平衡子树。
下面先看只旋转一次的情况

LL

在这里插入图片描述
在上述情况的A结点的左子树的左子树插入结点(树高变高了),导致平衡因子发生了变化,A结点在原来左子树的树高比右子树的树高,高了1个高度单位,又高了1个高度单位,A的平衡因子由1变成了2,平衡因子出错
在这里插入图片描述
观察上图,容易知道,不平衡是由于BL和AR在树高已经差1的情况下又不在同一个层级导致的,那么,只要上移BL,或下移AR即可,由二叉排序树可知,BL<B<A<AR,BL只能作为B的左子树,AR只能作为A的右子树,如果不这样,由于BL和AR都有可能已经存在左右结点,下移B结点或A结点都是很麻烦的事情,所以只能上移B结点(或说下移A结点)。

那此时B结点又有3个子结点,又需要调整,根据二叉排序树的原则:左子结点比父结点小,右子结点比父结点大。所以有 BL < B < BR < A,经过平衡二叉树的调整,B成了其他三个的父结点,再调整,分析一下,BL最小,只能为B的左子结点,右子结点就有了两个,留A结点,BR作为A的左子结点,满足二叉排序树的原则,如果留BR,把A作为BR的子结点的话,BR就有可能又是有3个子结点(舍),于是得到了下图
在这里插入图片描述
二叉树又平衡了

RR

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

RR 和 LL 的原理一样,就不过多赘述了。

LR

在这里插入图片描述
LR表示在A结点的左子结点B的右子树的高度,加高了一个高度单位,这也会导致A的平衡因子从原来的1变成了2,因为和前面的LL一样都是原来的A结点的左子树的树高为H+1,现在又加了一个结点,使得A结点的左子树的树高变成H+2。
在这里插入图片描述
考虑到平衡二叉树的原则,观察上图可以知道,原因就是CL的树高和AR的树高一样,但是CL和AR差了两层导致的,现只需将CL往上升即可。再考虑到二叉排序树,CL只能在C的左子树,或者C在CL的右子树(舍,CL可能左右子结点都存在,C不能下移)。由二叉排序树可知,B<CL<C<CR<A。CL又必须是C的左子树的结点,由此,只能将CL交给B,C作为B的父结点,由此得到下图(这个动作称为左旋,C结点左旋)。

在这里插入图片描述
现在AR和CL还是差两个层级,CL已经不能再上升了,因为CL必须在C的左子树中,如此,只能考虑将AR下移,由C<CR<A<AR,知AR必须在A的右子树中,所以只能下移A结点,A结点下移后,C就有了3个子结点,B<CR<A,A不能作为CR的子结点,故保留A结点,将CR作为A的左子结点(这个动作称为右旋,C结点右旋),得到下图

在这里插入图片描述

RL

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

RL原理同LR,这里不再赘述,简单来说两种情况都是,C变成A,B的父结点,C的CL交给C的新左子结点,C的CR交给C的新右子结点

3.结点删除

结点删除后,根据二叉排序树的原则,得到新的树,再根据这颗新树找到,最小的不平衡子树,就会找到插入结点的四种情况之一,再对其应用插入结点用到的平衡操作即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值