平衡二叉树(AVL树)深入解读

本文深入探讨了AVL树,一种平衡二叉搜索树,详细解释了其性质和平衡因子。阐述了为何需要平衡二叉树以确保高效的查找效率,并介绍了四种平衡调整算法:LL、RR、LR、RL旋转。最后,概述了创建平衡二叉树的递归插入方法。
摘要由CSDN通过智能技术生成

平衡二叉树又称AVL树


性质:

它或者是颗空树,或者是具有下列性质的二叉树:

  • 它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
  • 若将二叉树节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有节点的平衡因子只可能为-1,0,1.
  • 只要二叉树上有一个节点的平衡因子的绝对值大于1,那么这颗平衡二叉树就失去了平衡。

这里写图片描述
根据上述性质我们可以发现图(a)是一棵平衡二叉树,而图(b)是一棵不平衡二叉树。图中结点的数值代表的就是当前结点的平衡因子。也验证了上述性质,一棵平衡二叉树的所有结点的平衡因子只可能是-1、0、1三种。


为什么需要平衡二叉树?

当然,我们都希望所有的二叉排序树的初始序列都是平衡的,因为平衡二叉树上的任何一个结点左右字数的深度之差都不会超过1,则可以证明它的深度和logn是同数量级的,所以其平均查找长度也和logn同数量级。但是事于愿违有些二叉排序树的插入,或者初始序列由于其插入的先后顺序等缘故,将导致我们的二叉排序树的效率大大降低。如下图
这里写图片描述
为了避免这种情况的发生,我们希望可以有一种算法,将我们的不平衡的二叉排序树转化为平衡二叉排序树。这样就可以让我们的二叉排序树结构最优化。


平衡二叉树的算法

看到上述例子,我们就慢慢有点感觉了,至少知道了为什么会需要平衡二叉树,接下来我们看一下平衡二叉树是怎样将我们不平衡的树转换为平衡二叉树。
如何时构成的二叉排序树编程平衡二叉树呢?先看一个具体的例子
这里写图片描述

  • 图a 一颗空树也算是平衡二叉树
  • 图b 只有一个结点13的树也算是平衡二叉树
  • 图c 在图b的基础上插入新的结点24之后,仍然是平衡二叉树,只是根结点的平衡因子从0变到了-1(左子树的深度为0减去右子树的深度1等于-1)
  • 图d 在图c的基础上再插入一个结点37,这个时候整棵树出现了不平衡现象,根结点13的平衡因子从-1变成了-2。我们想要让这课树平衡,而且要保证该树二叉排序树的性质,那么我们只要将根结点13换为24结点13作为结点24的左子树,这棵树就又会回到平衡状态,如图e。我们把这种对树做向左逆时针“旋转”的操作称为单向左旋平衡处理。左旋之后,我们发现13、24、37结点的平衡因子都变为0。而且仍然保持着二叉排序树的特性
  • 图f当我们继续插入结点90之后,二叉树仍然平衡,只是24、37两个结点的平衡因子变为了-1,再次插入53结点之后,结点37的平衡因子BF由-1变为-2,这意味着该排序树中出现了新的不平衡现象,需要进行调整。但此时由于结点53插在结点90的左子树上,因此不能如上面一样作简单的调整。对于以上结点37为根的子树来说,既要保持二叉排序树的特性,又要平衡,则必须以53结点作为根结点,而使3**7结点成为它左子树的根,**90结点称为它右子树的根。这就好比做了两次旋转,首先我们让37、53、90这棵树单先向右顺时针转变成图g,再像左逆时针变成图h,这样我们的二叉树就能够再次回到平衡状态。对于以上旋转操作我们称为双向旋转(先右后左)平衡处理

平衡算法总结

看完了上面的例子,我们总结一下二叉排序树的不平衡情况以及如何将其转化为平衡情况。
一般情况下,假设由于在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为a(即a是离插入结点最近,且平衡因子绝对值不超过1的祖先结点),则失去平衡后进行调整的规律可以归纳为一下4种情况:

  1. 单向右旋平衡处理:由于在a的左子树根结点的左子树上插入结点,a的平衡因子由1增加到2,致使以a为根结点的子树失去平衡,则需要进行一次右向顺时针旋转操作。简称LL型旋转
    这里写图片描述
  2. 单想左旋平衡处理:由于在a的右子树根结点的右子树上插入结点,a的平衡因子由-1增加到-2,致使以a为根结点的子树失去平衡,则需要进行一次左向逆时针旋转操作。简称RR型旋转
    这里写图片描述
  3. 双向旋转(先左后右)平衡处理:由于在a的左子树的根结点的右子树上插入结点,a的平衡因子由1增加到2,致使a为根结点的子树失去平衡,则需要进行两次旋转(先左旋后右旋)操作。简称LR型旋转
    这里写图片描述
  4. 双向旋转(先右后左)平衡处理:由于在a的右子树的根结点的左子树上插入结点,a的平衡因子由1增加到2,致使a为根结点的子树失去平衡,则需要进行两次旋转(先右旋后左旋)操作。简称RL型旋转
    这里写图片描述

如何证明我们插入的正确性:中序遍历所得关键字的值序列从小到大即可(二叉排序树的性质)


那么如何创建一颗平衡二叉树呢?

创建平衡二叉树,我们采用依次插入节点的方式进行。而平衡二叉树上插入节点采用递归的方式进行。递归算法如下:

(1)若该树为一空树,那么插入一个数据元素为e的新节点作为平衡二叉树的根节点,树的高度增加1。

(2)若待插入的数据元素e和平衡二叉树(BBST)的根节点的关键字相等,那么就不需要进行插入操作。

(3) 若待插入的元素e比平衡二叉树(BBST)的根节点的关键字小,而且在BBST的左子树中也不存在和e有相同关键字的节点,则将e插入在BBST的左子树上,并且当插入之后的左子树深度增加1时,分别就下列情况处理之。

  • BBST的根节点的平衡因子为-1(右子树的深度大于左子树的深度):则将根节点的平衡因子更改为0(左旋),BBST的深度不变;

  • BBST的根节点的平衡因子为0(左右子树的深度相等):则将根节点的平衡因子修改为1(不用旋),BBST的深度增加1;

  • BBST的根节点的平衡因子为1(左子树的深度大于右子树的深度):若BBST的左子树根节点的平衡因子为1,则需要进行单向右旋转平衡处理,并且在右旋处理后,将根节点和其右子树根节点的平衡因子更改为0,树的深度不变;
    若BBST的左子树根节点的平衡因子为-1&#

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxnsirius

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值