2.常用数据结构-AVL树

本文介绍了AVL树的基本概念,包括其平衡条件、理想状态及实际应用中的平衡限制。此外还详细解释了如何通过左旋、右旋等操作来维护AVL树的平衡,并给出了具体的示例。

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

AVL树是带有平衡条件的查找二叉树。这个平衡条件要容易保持,而且他要保证树的深度为O(logN)

原文地址http://blog.youkuaiyun.com/qq_25806863/article/details/74755131

平衡条件

一个最理想的平衡条件是左右两个子树的高度完全相等,但只有节点数量为2^n-1的树才满足这个条件(n是层数,2层要3个,3层要7个)。这个条件太严格,不好用。

如果只要求根节点平衡的话,上面的条件可能会容易实现一点,但是会出现下面这样坏的二叉树: 
这里写图片描述

因此一颗AVL树的条件是,对于每个节点来说,这个节点的左右子树的高度最多差1.

简单示例

AVL树: 
这里写图片描述

非AVL二叉树: 
这里写图片描述

旋转

在每一次插入数值之后,树的平衡性都可能被破坏,这时可以通过一个简单的操作来矫正平衡–旋转

旋转的目的就是减少高度,通过降低整棵树的高度来平衡。哪边的树高,就把那边的树向上旋转。

通过旋转可以降低高度。

  • 所谓的左旋和右旋都是以子树为原点的:如b是a的子树,那么旋转就围绕b来进行。
  • 如果b是a的左子树,那么就围绕b将a向右旋转,看着就像是a直接掉下来了,掉成了b的右子树。
  • 如果b是a的右子树,那么就围绕b将a向左旋转,看着就像是a直接掉下来了,掉成了b的左子树。

插入节点时分四种情况,四种情况对应的旋转方法是不同的:

例如对于被破坏平衡的节点 a 来说:

插入方式描述旋转方式
LL在a的左子树根节点的左子树上插入节点而破坏平衡右旋转
RR在a的右子树根节点的右子树上插入节点而破坏平衡左旋转
LR在a的左子树根节点的右子树上插入节点而破坏平衡先左旋后右旋
RL在a的右子树根节点的左子树上插入节点而破坏平衡先右旋后左旋
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值