平衡二叉树实现原理

平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。 下面讲解一个平衡二叉树构建过程的例子。现在又a[10] = {3, 2, 1, 4, 5, 6, 7, 10, 9, 8}需要构建二叉排序树。在没有学习平衡二叉树之前,根据二叉排序树的特性,通常会将它构建成如下左图。虽然完全符合二叉排序树的定义,但是对这样高度达到8的二叉树来说,查找是非常不利的。因此,更加期望构建出如下右图的样子,高度为4的二叉排序树,这样才可以提供高效的查找效率。

现在来看看如何将一个数组构成出如上右图的树结构。 对于数组a的前两位3和2,很正常地构建,到了第个数“1”时,发现此时根结点“3”的平衡因子变成了2,此时整棵树都成了最小不平衡子树,需要进行调整,如下图图1(结点左上角数字为平衡因子BF值)。因为BF为正,因此将整个树进行右旋(顺时针),此时结点2成了根结点,3成了2的右孩子,这样三个结点的BF值均为0,非常的平衡,如下图图2所示。

然后再增加结点4,平衡因子没有改变,如上图图3。增加结点5时,结点3的BF值为-2,说明要旋转了。由于BF是负值,对这棵最小平衡子树进行左旋(逆时针旋转),如下图图4,此时整个树又达到了平衡。

继续增加结点6时,发现根结点2的BF值变成了-2,如下图图6所示。所以对根结点进行了左旋,注意此时本来结点3是结点3的左孩子,由于旋转后需要满足二叉排序树特性,因此它成了结点2的右孩子,如图7所示。

增加结点7,同样的左旋转,使得整棵树达到平衡,如下图8和9所示。

当增加结点10时,结构无变化,如图10所示。再增加结点9,此时结点7的BF变成了-2,理论上只需要旋转最小不平衡树7、9、10即可,但是,如果左旋转后,结点9变成了10的右孩子,这是不符合二叉排序树的特性的,此时不能简单的左旋。如图11所示。

仔细观察图11,发现根本原因在于结点7的BF是-2,而结点10的BF是1,也就是说,它们两个一正一负,符号并不统一,而前面的几次旋转,无论左还是右旋,最小不平衡子树的根结点与它的子结点符号都是相同的。这就是不能直接旋转的关键。 不统一,不统一就把它们先转到符号统一再说,于是先对结点9和结点10进行右旋,使得结点10成了9的右子树,结点9的BF为-1,此时就与结点7的BF值符号统一了,如图12所示。

这样再以结点7为最小不平衡子树进行左旋,得到如下图13。接着,插入8,情况与刚才类似,结点6的BF是-2,而它的右孩子9的BF是1,如图14,因此首先以9为根结点,进行右旋,得到图15,此时结点6和结点7的符号都是负,再以6为根结点左旋,最终得到最后的平衡二叉树,如图16所示。

通过这个例子,可以发现,当最小不平衡树根结点的平衡因子BF是大于1时,就右旋,小于-1时就左旋,如上例中的结点1、5、6、7的插入等。插入结点后,最小不平衡子树的BF与它的子树的BF符号相反时,就需要对结点先进行一次旋转以使得符号相同后,再反向旋转一次才能够完成平衡操作,如上例中结点9、8的插入时。

计算机考研8,计算机考研每日一练:第八天相关推荐

  1. 计算机二级7月考试,2020年计算机二级MS Office考试每日一练(7月27日)

    [摘要] 小编整理了2020年计算机二级MS Office考试每日一练(7月27日)的相关内容,下面一起来看看2020年计算机二级MS Office考试每日一练(7月27日)的具体内容吧,希望能够帮助 ...

  2. 计算机二级7月考试,2020年计算机二级MS Office考试每日一练(7月15日)

    [摘要] 小编整理了2020年计算机二级MS Office考试每日一练(7月15日)的相关内容,下面一起来看看2020年计算机二级MS Office考试每日一练(7月15日)的具体内容吧,希望能够帮助 ...

  3. 在实际使用中 mysql所支持的触发器有_计算机二级考试MySQL数据库每日一练 12月26日...

    1.使用SELECT将表中数据导出到文件,可以使用哪一子句?D A.TO FILE B. FILE C.OUTTO FILE D. 2.存储程序中不是循环语句是( ) A.REPEAT B.WHILE ...

  4. java将naso注册成计算机服务_2018计算机二级考试Java语言每日一练 8月2日

    1.软件测试的目的是 A.评估软件可靠性 B.发现并改正程序中的错误 C.改正程序中的错误 D.发现程序中的错误 2.软件测试的目的是 A.评估软件可靠性 B.发现并改正程序中的错误 C.改正程序中的 ...

  5. 关于select的描述计算机,计算机二级考试MySQL数据库每日一练 12月21日

    单项选择题 1.SQL语句中修改表结构的命令是( ). A.MODIFY TABLE B.MODIFY STRUCTURE C.ALTER TABLE D.ALTER STRUCTURE 2.通过以下 ...

  6. 计算机组成原理 启航教育,2021计算机考研:计算机组成原理知识点CPU的功能和基本结构...

    启航教育小编为大家整理了关于"2021考研:计算机组成原理知识点CPU的功能和基本结构"的相关内容,希望可以帮助到大家,祝大家考上自己理想的院校 CPU的功能和基本结构 CPU主要 ...

  7. 北交大计算机在职非全考研初试心得

    2019 年 2 月 12 日,我正式踏上了考研之路,报考的是北京交通大学计算机学院电子信息软件工程方向(非全日制).初试成绩 322,超去年分数线 50 多分,目前正在准备复试.闲暇之余,我想把初试 ...

  8. 计算机专业考研二战,2019计算机考研二战考生考研数学要规避的三个误区

    以下是新东方在线整理的2019计算机考研二战考生考研数学要规避的三个误区,请参考: 一.看中速度,看中数量 众所周知,考研数学要想得高分,需要考生练习一定数量的题目.有些考生在做题的过程中,喜欢跟周围 ...

  9. 2021计算机专业课考研大纲,2021考研计算机大纲原文:操作系统

    2021考研大纲已经发布,知道各位同学已经按捺不住激动的心情了,考研大纲是考研复习的指向标,小编第一时间为大家整理了2021考研计算机大纲部分原文,操作系统部分考查内容,供大家参考. 操作系统 [考查 ...

  10. 计算机组成原理名词解释常用,2018考研408计算机组成原理名词解释(3)

    2018考研408计算机组成原理名词解释(3) 2017-09-29 16:02 | 考研集训营 随着时代的快速发展,任何行业都离不开网络,导致计算机行业近几年非常的火热,使各大高校竞相争抢优秀人才, ...

最新文章

  1. window document树
  2. 【划分树】 POJ 2104 HDU 2665 K-th Number 裸题
  3. C#操作Excel时,Excel常用的方法和属性zz
  4. Js选择框脚本 移动操作select 标签中的 option 项的操作事项
  5. 16-CoreData之多表关联(存储自定义数据模型)
  6. 函数不可访问_关于可重入函数
  7. IISASP.NET 站点IP跳转到域名
  8. Objective-C 的动态提示和技巧
  9. omwin密立根油滴实验数据处理程序_哈工程最新大物实验报告29——磁场的测量...
  10. Crontab使用心得
  11. 奥特曼传奇英雄存档丢了怎么找回_热血传奇复古传奇:传奇游戏手机版竟然比端游还火爆?你觉得呢?...
  12. 2018年双十一:计算机品类纸质书籍销量冠军
  13. 云服务器保存文件,云服务器保存文件命令
  14. 提取频散曲线matlab程序,2.2 PCDISP圆柱杆频散曲线求解
  15. Springboot 中类不能使用@Value注解从yml中加载值
  16. 上海高考物理能不能用计算机,上海高考物理卷并未超纲 但不按套路出牌
  17. WebBrowser怎么指定ie内核
  18. 怪物的生成 攻击和掉落金币
  19. 中国版权保护中心注册流程(含实名认证)
  20. 使用PicGo配置七牛云图床(图文步骤详细)

热门文章

  1. ENSP配置 实例二 单臂路由配置
  2. 大学计算机一级b笔记,全国计算机等级一级B Excel考试整理笔记
  3. c++输入错误重新输入_C程序-根据时长和时薪计算工资1.3(解决输入非数字选项退出的bug)...
  4. 河南大学计算机与信息工程学院张磊,张磊-食品与生物工程学院
  5. git安装 perl ubuntu_ubuntu下安装git
  6. 【OpenCV 例程200篇】61. 导向滤波(Guided filter)
  7. access inner join 数据类型不匹配_用Access开发生产管理系统
  8. 代码整理工具_整理了 11 个好用的代码质量审核和管理工具
  9. uniapp 输入框防抖节流_拉动一下控制台大小,后台请求数量爆炸,竟是没做好防抖与节流...
  10. 计算机基础word-常见问题