AVL

AVL是(Adelson-Velskii 和 Landis) 在1962年的论文中提出的解决二叉树不平衡的一种数据结构.

为什么需要AVL
在BST中, 如果我们按照顺序插入元素, 那么BST会形成最坏的情况: 退化为链表, 那么就失去了原本的O(logN)的时间复杂度, 转而变为O(N)的时间复杂度. 如下图所示:

造成这个问题的原因是因为: 我们的BST发生了不平衡的情况. AVL数据结构就是为了解决这个问题.

如何保证树的平衡
很简单的一种情况, 我们让每个节点的左右子树都具有相同的高度, 这种想法不要求树的深度. 因此设想一下, 某个节点的左右子树都很深, 这样该节点的左右子树实际上都是一个链表.

另一种平衡条件要求每个节点都左右子树都必须有相同的高度, 但该方式太严格, 难以使用.

AVL的平衡要求
AVL要求每个节点都左子树和右子树的高度最多相差为1. (如果没有左右子树, 高度为1).

AVL平衡基础

节点高度
前面提到AVL的平衡要求, 因此需要对每个节点进行高度的标注 (编程上每个节点的结构都需要附带一个高度值). 如下图所示

根据AVL的性质, 左边的二叉树是AVL树, 右边的则不是AVL树, 因为不满足AVL平衡要求.
根据图就可以看出来, 节点的高度计算为: s(h) = max(s.left.h, s.right.h) + 1

平衡因子
前面提到了AVL树存在节点高度, 有了节点高度, 就可以据此 计算出来平衡因子.
平衡因子的计算为 s(f) = abs(s.left.h - s.right.h), 有了平衡因子, 就可以判断当前节点是否满足AVL的性质, 如果 s(f) > 1 则不平衡, 此时需要进行处理. 处理的方式也成为 AVL旋转

AVL旋转

在进行AVL旋转之前, 先要搞清楚什么情况会导致二叉树不平衡.
对二叉树的添加删除会破坏树的平衡性, 此时就需要进行旋转了. 不过AVL的旋转添加和删除都会导致, 因此我们将从添加操作开始引出AVL树的旋转算法, 在删除操作的时候可以复用这些旋转算法.

以前面图中展示的平衡二分搜索树为例, 此时往该树中添加元6, 就得到了一棵新的二分搜索树, 不过它是不平衡的 (8这个节点平衡因子大于1), 如图所示:



对于二叉树来说, 任意节点最多有两个字节点, 因此高度不平衡时, 该节点的两棵子树高度差为2 (添加和删除每次都是一个节点, 同时本次不平衡的时候就会执行旋转操作).
这样不平衡的情况就分为以下4种情形

LL (左儿子的左子树)

如图所示, 插入节点6造成了8所在的节点不平衡, 这种情况叫做LL


对于LL, 需要进行一次旋转来保证AVL的性质.

那么怎么进行旋转呢?

对于插入节点6来说, 插入路径是 6 <- 7 <- 8 <-5 , 因此不平衡的情况也只会发生在这条路径上, 只要沿着该路径向上回溯, 通过计算平衡因子看是否满足AVL性质, 如果出现不满足的节点, 就进行一次旋转,旋转过程如图:

未命名文件-3.png

从图上可以看出旋转过程涉及8和7两个节点, 发生不平衡的节点是8, 通过旋转操作后对于同样在路径上的5来说平衡因子是满足AVL要求的, 因此并不需要旋转.

我们把上面描述的旋转过程成为 右旋转

旋转可以描述为:

8->Left = 7->Right
7->Right = 8

RR (右儿子的右子树)

和LL相对应的一种情况是RR, 对于RR情况的修复操作称为左旋转, 具体方式和LL的右旋转相差不大, 如图:

旋转可以描述为:

Y->Right = X->Left
X->Left = Y 

单旋转总结

前面提到的LL和RR两种单旋转,属于对称的旋转,有时候也叫它们为单旋转,这一小节通过一个完整的插入示例来对单旋转整体来做一个总结。

插入节点4的时候依旧保持BST以及AVL的性质,插入节点5后以2为节点的右子树高度为3,左子树高度为1,因此引发了一次左旋转,旋转之后满足AVL的性质,同时也满足BST的性质。

下图描述了另一种情况,插入节点11后,根节点3和节点4都不平衡了,但由于向上回溯,因此首先会对节点4进行旋转,而旋转后节点3和4都满足了AVL性质,此时3就不需要处理了。


因此在编程的时候需要格外注意:由旋转引起的局部变化,树的其余部分需要知道该变化

LR

前面描述的LL和RR情况都是插入的元素在不平衡节点的左侧的左侧以及右侧的右侧
但由于每个节点都有两个子节点,因此插入的元素有可能在不平衡节点的左侧的右侧以及右侧的左侧,这两种情况的旋转称为LR和RL,也叫做双旋转。

来看一种LR的情况,如下图所示,三个节点的大小关系为 k1 < k2 < k3,从图中可以看出,使用前面描述的LL和RR情况旋转后都不能满足大小关系。因此对于LR的情况,单纯的左旋转和右旋转都不能满足。

对于LR情形,为了解决这个问题,就需要使用左-右双旋转。来看对于上图,通过左-右双旋转旋转后得到的样子:


此时是满足前面描述的大小关系的,那么左-右双旋转具体是如何操作的呢?通过下面这张图来说明:
未命名文件.png

首先对k3的左节点k1进行左旋转,得到一个旋转结果后在对k3进行右旋转,经过两次旋转后,得到一棵新树,这棵树是满足AVL性质的,同时也满足BST的性质。

LR的旋转过程可以描述为:

// 左旋转 
k1.right= k2.left
k2.left = k1
// 右旋转
k3.left = k2.right
k2.right = k3

RL

RL和LR的左-右双旋转差不多,通过右-左双旋转调整插入元素在节点的右子树的左子树,如下图所示:

首先对k3节点进行右旋转,得到一个新的旋转结果后,在对k1进行左旋转,经过两次旋转后,新的树满足AVL以及BST的性质。

RL的旋转过程可以描述为:

//右旋转
k3.left =k2.right
k2.right = k3
//左旋转
k1.right = k2.left
k2.left = k1

双旋转总结

AVL删除

AVL相关优化

AVL的局限性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容