【概述】

二叉排序树的查找效率取决于二叉排序树的形态,而构造一棵形态均匀的二叉排序树与结点的插入次序有关,但结点的插入次序不是随人的意志决定的,这就要求我们找到一种动态平衡的方法,对于任意给定的关键码序列都能构造一科形态均匀、平衡的二叉排序树。

平衡二叉树(Balance Binary Tree)又称 AVL 树,其本质是一种高度平衡的二叉排序树,其或是一棵空的二叉排序树,或是满足以下性质的二叉排序树:

  • 根结点的左子树和右子树深度最多相差 1
  • 根结点的左子树和右子树也是平衡二叉树

根据平衡二叉树的定义,将某个结点的左子树的深度与右子树的深度之差称为平衡因子(Balance Factor),将在平衡二叉树构造过程中,以距离插入结点最近的、且平衡因子绝对值大于 1 的结点为根的子树称为最小不平衡子树(Minimal Unbalance SubTree)

【平衡二叉树的构造】

构造平衡二叉树的基本思想是:在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因结点插入而破坏了树的平衡性,若是,则找出最小不平衡子树,在保持二叉排序树的特性前提下,调整最小不平衡子树中各结点的位置,进行相应旋转,使其成为新的平衡子树。

设结点 A 为最小平衡树的根结点,对该子树进行平衡调整归纳起来有以下四种情况:

1.LL 型

当新插入的结点是插在结点 A 的左孩子的左子树上,即为 LL 型。

设结点 B 是结点 A 的左子树的根结点,Bl、Br 分别为结点 B 的左右子树,Ar 为结点 A 的右子树,且 Bl、Br、Ar 三棵子树的深度均为 h,将结点 x 插入到结点 B 的左子树 Bl 上,导致结点 A 的平衡因子由 1 变为 2,使得以结点 A 为根的子树失去了平衡,如下图:

将支撑点由 A 改为 B,相应的进行顺时针旋转,旋转后,结点 A 及其右子树 Ar 和结点 B 的右子树 Br 发生冲突,按旋转优先原则,结点 A 成为 B 的右孩子结点,结点 B 的右子树 Br 成为结点 A 的左子树,如下图:

2.RR 型

当新插入的结点是插在结点 A 的右孩子的右子树上,即为 RR 型。

设结点 B 是结点 A 的右子树的根结点,Bl、Br 分别为结点 B 的左右子树,Al 为结点 A 的左子树,且 Bl、Br、Ar 三棵子树的深度均为 h,将结点 x 插入到结点 B 的右子树 Br 上,导致结点 A 的平衡因子由 -1 变为 -2,使得以结点 A 为根的子树失去了平衡,如下图:

将支撑点由 A 改为 B,相应的进行逆时针旋转,旋转后,结点 A 及其左子树 Al 和结点 B 的左子树 Bl 发生冲突,按旋转优先原则,结点 A 成为 B 的左孩子结点,结点 B 的左子树 Bl 成为结点 A 的右子树,如下图:

3.LR 型

当新插入的结点是插在结点 A 的左孩子的右子树上,即为 LR 型。

设结点 B 是结点 A 的左子树的根结点,结点 C 是结点 B 的右子树的根节点,Ar 为结点 A 的右子树,Bl 为结点 B 的左子树,Cl、Cr 分别为结点 C 的左右子树,且 Bl、Ar 两棵子树的深度为 h,Cl、Cr 两棵子树的深度为 h-1,将结点 x 插入到结点 C 的左子树 Cl 上,导致结点 A 的平衡因子由 1 变为 2,使得以结点 A 为根的子树失去了平衡,如下图:

对于 LR 型,需旋转两次:

1)第一次旋转:根节点 A 不动,调整结点 A 的左子树,将支撑点由结点 B 调整到结点 C 处,相应的进行逆时针旋转,旋转后,结点 B 及其左子树与结点 C 的左子树 Cl 发生冲突,按旋转优先原则,结点 C 的左子树成为 B 的右子树,如下图:

2)第二次旋转:将支撑点由结点 A 调整到结点 C, 相应的进行顺时针旋转,旋转后,结点 A 及其右子树 Ar 与结点 C 的右子树 Cr 发生冲突,按旋转优先原则,结点 C 的右子树成为结点 A 的左子树,如下图:

4.RL 型

当新插入的结点是插在结点 A 的右孩子的左子树上,即为 RL 型。

设结点 B 是结点 A 的右子树的根结点,结点 C 是结点 B 的左子树的根节点,Al 为结点 A 的左子树,Br 为结点 B 的右子树,Cl、Cr 分别为结点 C 的左右子树,且 Br、Al 两棵子树的深度为 h,Cl、Cr 两棵子树的深度为 h-1,将结点 x 插入到结点 C 的右子树 Cr 上,导致结点 A 的平衡因子由 -1 变为 -2,使得以结点 A 为根的子树失去了平衡,如下图:

对于 RL 型,需旋转两次:

1)第一次旋转:根节点 A 不动,调整结点 A 的右子树,将支撑点由结点 B 调整到结点 C 处,相应的进行顺时针旋转,旋转后,结点 B 及其右子树与结点 C 的右子树 Cr 发生冲突,按旋转优先原则,结点 C 的右子树成为 B 的左子树,如下图:

2)第二次旋转:将支撑点由结点 A 调整到结点 C, 相应的进行逆时针旋转,旋转后,结点 A 及其左子树 Al 与结点 C 的左子树 Cl 发生冲突,按旋转优先原则,结点 C 的左子树成为结点 A 的右子树,如下图:

理论基础 —— 查找 —— 平衡二叉树相关推荐

  1. 理论基础 —— 查找

    [概述] 查找是在具相同类型的记录构成的集合中,找出满足给定条件的记录,给定的查找条件是多样的,为便于讨论,将查找条件限制为 "匹配",即查找关键码等于给定值的记录. 在查找中,常 ...

  2. 理论基础 —— 查找 —— 二叉排序树

    [概述] 二叉排序树(Binary Search Tree),又称二叉查找树,其本质是按一定的顺序进行构造的二叉树. 其递归定义如下: 若其左子树不空,则左子树上所有结点的值均小于根结点的值 若其右子 ...

  3. 理论基础 —— 查找 —— 斐波那契查找

    [概述] 斐波那契查找,其利用了黄金分割原理来对二分查找进行了改进. 黄金分割又称黄金比例,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约 ...

  4. 理论基础 —— 查找 —— 插值查找

    [概述] 以查字典为例,在英文字典中查 "apple" 时,下意识的会翻开前面的书页,当查 "zoo" 时,下意识的翻开一定是后面的书页,显然,此时还绝对不是从 ...

  5. 理论基础 —— 查找 —— 顺序查找

    [概述] 顺序查找是最基本的查找技术之一,其基本思想是:从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值 k 相比较,若相等则表示查找成功:若扫描结束仍没有找到关键字等于 k 的 ...

  6. 理论基础 —— 查找 —— 二分查找

    [概述] 二分查找又称折半查找,其要求线性表中的记录必须按关键码有序,且必须采用顺序存储. 其基本思想是:用给定值 k 先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功:若不相 ...

  7. ds查找—二叉树平衡因子_面试官让我手写一个平衡二叉树,我当时就笑了

    平衡二叉树对于初学者一直是一个比较复杂的知识点,因为其里面涉及到了大量的旋转操作.把大量的同学都给转晕了.这篇文章最主要的特点就是通过动画的形式演示.确保大家都能看懂.最后是手写一个平衡二叉树. 一. ...

  8. 数据结构——平衡二叉树

    一.平衡二叉树的定义 平衡二叉树(AVL 树)仍然是一棵二叉查找树,只是在其基础上增加了"平衡"的要求.所谓平衡是指,对 AVL 树的任意结点来说,其左子树与右子树的高度之差的绝对 ...

  9. 数据结构-平衡二叉树(AVL树)

    目录 1,平衡二叉树的介绍 1.1,二叉排序树存在的问题 1.2,平衡二叉树 1.3,平衡二叉树的创建 1.4,平衡二叉树的查找 2,代码实现 2.1,平衡二叉树的节点类型 2.2,LL旋转(单右旋转 ...

最新文章

  1. 小米手机怎么用计算机,小米手机怎么连接电脑,详细教您小米手机连接电脑
  2. html实现让电脑断网的功能,13. Electron 断网提醒功能的实现
  3. eolinker开源版5_开源土豪沉金版空气质量检测仪AirWolf
  4. hive启用本地模式
  5. iphone电池怎么保养_蓄电池在ups系统中应该怎么维护保养?
  6. jQuery 1.4单独为某个动画动作设效果
  7. SAP ABAP实用技巧介绍系列之 ABAP XSLT 定义变量
  8. [js] Geolocation.getCurrentPosition()用来做什么的?在什么浏览器不受兼容?
  9. 【原创】从 列表的重复 到 用sum展开二层嵌套列表将子元素合并
  10. 均值滤波器类型_均值滤波适用于处理什么样的噪声
  11. 网线接法:交叉线、直通线的网线水晶头图解
  12. Linux ext4文件系统下 extundelete 恢复 误删除的文件
  13. java 重命名_Java如何重命名文件?
  14. JS事件 鼠标移开事件(onmouseout)鼠标移开事件,当鼠标移开当前对象时,执行onmouseout调用的程序。...
  15. tomcat lb cluster
  16. 多元线性回归分析spss结果解读_SPSS案例实践笔记:多重线性回归分析
  17. eNSP路由器启动不了
  18. 信息摘要技术 - SHA系列
  19. 富士胶片记录媒体:磁带存储或将成为数据安全的最后防线
  20. 解读腾讯音乐Q3财报:营收上涨31% 音乐市场下半场战事即将开启?

热门文章

  1. [导入]mootools框架【三】-Array篇: 主要方法测试实例
  2. docker添加jar包_Docker部署jar包
  3. img文件编辑_只会用chmod 777?Linux下的文件权限居然还有这么多骚操作
  4. 学会了CopyOnWriteArrayList可以再多和面试官对线三分钟
  5. MacBook写代码真香!包邮送一台!
  6. 一本关于HTTP的恋爱日记
  7. 面试官:缓存一致性问题怎么解决?
  8. 梁鑫:美股交易架构实践
  9. 程序人家:你的老板逼你上微服务了吗??
  10. Easyui 页面访问慢解决方案,GZIP网站压缩加速优化