平衡二叉查找树

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


介绍

计算机科学发展至今,已经出现了若干种平衡二叉查找树,其中最先发明的是 AVL 树。
所有平衡树基本由以下三个特征组成:
1.自平衡条件
2.旋转操作
3.旋转的触发
平衡树通过设置合理的自平衡条件,使得二叉排序树的查找、插入等操作的性能不至于退化到 O(n)O(n),并且在进行二叉排序树的查找、插入等操作时进行判断,如果满足其中某个旋转的触发条件,则进行对应的旋转操作。

一、自平衡条件

AVL 树提出了一个概念:平衡因子(balance factor)。每个结点的平衡因子是指它左子树最大高度和右子树最大高度的差。在 AVL 树中,平衡因子为 -1−1、00、11 的结点都被认为是平衡的,而平衡因子为 -2−2、22 等其他值的结点被认为是不平衡的,需要对这个结点所在子树进行调整
在这里插入图片描述

对结点 4 来说,平衡因子为 |height(left) - height(right)|=|3-1|=2>1,所以不平衡

二、旋转操作

在 AVL 树中,一共有两种单旋操作:左旋和右旋。AVL 树通过一系列左旋和右旋操作,将不平衡的树调整为平衡树。

左旋操作的演示如下:
在这里插入图片描述
通过进行左旋操作,使得原先的根 4变成了其左孩子2的右孩子,而 2 原先的左孩子 3变成了 4 的左孩子。

对应的,右旋操作的演示如下:
在这里插入图片描述
通过右旋操作,使得原先的根 5变成了其左孩子 3 的右孩子,而 3 原先的右孩子变成了 5 的左孩子。

多旋

AVL 树中还有两种复合旋转操作(即“多旋”),由两次单旋操作组合而成

第一种是左旋加右旋:
在这里插入图片描述
第二种是右旋加左旋:
在这里插入图片描述

三、旋转的触发

插入操作

在插入一个元素后不断回溯的过程中,如果因此导致结点不平衡,则根据不平衡情况(一定是一边子树比另一边子树的高度大 2)进行对应的旋转:

1.左子树比右子树的高度大 2:

如果新增元素插入到左儿子的左子树中,则进行右旋操作。(LL 型调整)
如果新增元素插入到左儿子的右子树中,则进行左旋加右旋操作。(LR 型调整)

2.右子树比左子树的高度大 2:

如果新增元素插入到右儿子的右子树中,则进行左旋操作。(RR 型调整)
如果新增元素插入到右儿子的左子树中,则进行右旋加左旋操作。(RL 型调整)

删除操作

类似的,在删除一个元素后不断回溯的过程中,如果因此导致结点不平衡,则和插入操作采用相同的调整操作,确保在删除以后整棵树依然是平衡的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值