平衡二叉树[AVL]

1 名词说明

二叉树:每个结点最多含有两个子树的树
针对结点个数存在一些特殊的二叉树,如:

  • 满二叉树:叶结点除外的所有结点均含有两个子树的树被称为满二叉树
  • 完全二叉树:除最后一层外,所有层都是满结点,且最后一层缺右边连续结点的二叉树称为完全二叉树
    另外对于二叉搜索树、平衡二叉树、红黑树在下文中进一步详细说明。

2 二叉搜索树

又叫做二叉查找树、二叉排序树
其具有以下性质:

  • 若它的左子树不为空,则左子树上所有结点的值都小于根结点的值
  • 若它的右子树不为空,则右子树上所有结点的值都大于根结点的值
  • 它的左右子树也分别为二叉搜索树
    特别说明:二叉搜索树中序遍历的结果是有序的

3 平衡二叉树【AVL】

3.1 定义

由前苏联的数学家 Adelse-Velskil 和 Landis 在 1962 年提出的高度平衡的二叉树,根据科学家的英文名也称为 AVL 树。
它具有如下几个性质:

  • 可以是空树。
  • 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 1。


    image.png

3.2 平衡因子

某结点的左子树与右子树的高度(深度)差即为该结点的平衡因子BF(Balance Factor),平衡二叉树中不存在平衡因子大于 1 的结点。在一棵平衡二叉树中,结点的平衡因子只能取:

  • 0:左右子树等高
  • 1:左子树比较高
  • -1:右子树比较高。

3.3 插入结点

插入失衡示例


image.png

在12结点下面插入15:


image.png

3.3.1 最小失衡子树

在新插入的结点向上查找,以第一个平衡因子的绝对值超过 1 的结点为根的子树称为最小不平衡子树。也就是说,一棵失衡的树,是有可能有多棵子树同时失衡的。而这个时候,我们只要调整最小的不平衡子树,就能够将不平衡的树调整为平衡的树。
【3.3.1 失衡示例】中以50为父结点的子树为最小失衡子树。
平衡二叉树的失衡调整主要是通过旋转最小失衡子树来实现的。根据旋转的方向有两种处理方式,左旋右旋

3.3.2 右旋

流程:
1.结点的左孩子替代此结点位置
2.左孩子的右子树变为该结点的左子树
3.结点本身变为左孩子的右子树
【3.3.1 失衡示例】中由于50父结点的左子树高度比右子树大2,故需要右旋,其流程如下:


image.png

3.3.3 左旋

流程:
1.结点的右孩子替代此结点位置
2.右孩子的左子树变为该结点的右子树
3.结点本身变为右孩子的左子树

3.4 四种结点插入方式

假设一颗 AVL 树的某个结点为 A,有四种操作会使 A 的左右子树高度差大于 1,从而破坏了原有 AVL 树的平衡性。平衡二叉树插入结点的情况分为以下四种:

插入方式 描述 旋转方式
LL 在A的左子树根结点的左子树上插入结点 右旋转
RR 在A的右子树根结点的右子树上插入结点 左旋转
LR 在A的左子树根结点的右子树上插入结点 先左旋后右旋
RL 在A的右子树根结点的左子树上插入结点 先右旋后左旋

3.4.1 LL

image.png

3.4.2 RR

image.png

3.4.3 LR

image.png

3.4.4 RL

image.png

所有不平衡情况下,先寻找最小不平衡树,判断其所属的不平衡类别,再根据上述4种类别进行固定化程序的操作。
LL , LR ,RR ,RL其实已经为我们提供了最后哪个结点作为新的根指明了方向。如 LR 型最后的根结点为原来的根的左孩子的右孩子,RL 型最后的根结点为原来的根的右孩子的左孩子。只要记住这四种情况,可以很快地推导出所有的情况。

3.5 删除结点

删除结点分为四种情况:
1.删除叶子结点
2.删除的结点只有左子树
3.删除的结点只有右子树
4.删除的结点既有左子树又有右子树
AVL 树在删除结点后需要重新检查平衡性并修正,插入操作后只需要对插入栈中的弹出的第一个非平衡结点进行修正,而删除操作需要修正栈中的所有非平衡结点。

对左或者右子树的删除操作相当于对右或者左子树的插入操作,然后再对应上插入的四种情况选择相应的旋转就好了。

3.5.1 删除叶子结点

操作:直接删除,然后依次向上调整为AVL树。


删除结点1-1.png

删除结点1-2.png

3.5.2 删除的结点只有左子树

操作:该节点的值替换为左孩子节点的值,然后删除左孩子节点。


删除结点2.png

3.5.3 删除的结点只有右子树

操作:该节点的值替换为右孩子节点的值,然后删除右孩子节点。


删除结点3.png

3.5.4 删除的结点既有左子树又有右子树

操作:该节点的值替换为该节点的前驱节点(或者后继节点),然后删除前驱节点(或者后继节点)


删除结点4.png

附录

平衡二叉树的实现:红黑树、AVL、替罪羊树、Treap、伸展树

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

推荐阅读更多精彩内容