(数据结构)[python](14)----AVL树

AVL树是一种特殊的二叉查找树,保持左右子树高度差不超过1,确保高效查找。文章详细介绍了AVL树的平衡因子、插入操作可能引发的平衡破坏以及对应的单旋转(右旋)和双旋转(左右旋、右左旋)的调整策略,通过实例展示了旋转过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AVL树(平衡二叉树):

AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为平衡二叉树。下面是平衡二叉树和非平衡二叉树对比的例图:
  在这里插入图片描述
    平衡因子(bf): 结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1;

AVL树的基本操作:

AVL树的操作基本和二叉查找树一样,这里我们关注的是两个变化很大的操作:插入和删除!

我们知道,AVL树不仅是一颗二叉查找树,它还有其他的性质。如果我们按照一般的二叉查找树的插入方式可能会破坏AVL树的平衡性。同理,在删除的时候也有可能会破坏树的平衡性,所以我们要做一些特殊的处理,包括:单旋转和双旋转!

AVL树的插入,单旋转的第一种情况—右旋:
  在这里插入图片描述
由上图可知:在插入之前树是一颗AVL树,而插入之后结点T的左右子树高度差的绝对值不再 < 1,此时AVL树的平衡性被破坏,我们要对其进行旋转。由上图可知我们是在结点T的左结点的左子树上做了插入元素的操作,我们称这种情况为左左情况,我们应该进行右旋转(只需旋转一次,故是单旋转)。具体旋转步骤是:
  T向右旋转成为L的右结点,同时,Y放到T的左孩子上。这样即可得到一颗新的AVL树,旋转过程图如下:
  在这里插入图片描述
    左左情况的右旋举例:
    在这里插入图片描述
    以上就是插入操作时的单旋转情况!我们要注意的是:谁是T谁是L,谁是R还有谁是X,Y,Z!T始终是开始不平衡的左右子树的根节点。显然L是T的左结点,R是T的右节点。X、Y、Y是子树当然也可以为NULL.NULL归NULL,但不能破坏插入时我上面所说的左左情况或者右右情况。

AVL树的插入,双旋转的第一种情况—左右(先左后右)旋:
 在这里插入图片描述
 由上图可知,我们在T结点的左结点的右子树上插入一个元素时,会使得根为T的树的左右子树高度差的绝对值不再 < 1,如果只是进行简单的右旋,得到的树仍然是不平衡的。我们应该按照如下图所示进行二次旋转:
 在这里插入图片描述
  左右情况的左右旋转实例:
  在这里插入图片描述
    AVL树的插入,双旋转的第二种情况—右左(先右后左)旋:
    在这里插入图片描述
由上图可知,我们在T结点的右结点的左子树上插入一个元素时,会使得根为T的树的左右子树高度差的绝对值不再 < 1,如果只是进行简单的左旋,得到的树仍然是不平衡的。我们应该按照如下图所示进行二次旋转:
在这里插入图片描述
  右左情况的右左旋转实例:
  在这里插入图片描述

总结

实现
1,判断插入操作是否破坏平衡
2,选择单旋还是双旋
(1) 对该结点的左儿子的左子树进行了一次插入。(右)
(2) 对该结点的左儿子的右子树进行了一次插入。(先左后右)
(3) 对该结点的右儿子的左子树进行了一次插入。(先右后左)
(4) 对该结点的右儿子的右子树进行了一次插入。(左)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值