计算机考研8,计算机考研每日一练:第八天

平衡二叉树实现原理

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

16add2141ac30286c6b6e24f4cf2da40.png

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

aae9b38e7571f297ba09bacbff707faa.png

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

61d95de1a2a1d47916c889a0fe180940.png

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

1928412356277f5021585a9f66e1b5bc.png

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

cbbba6a2b4567398b4b0a3c6ece62071.png

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

e38405bb5ac70bb3a797b69845562415.png

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

6c1cec4c0542c6f3c6860638032585ed.png

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

77aae30659550726a97b27919bec1dca.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python全栈开发:web框架们

Python的WEB框架 Bottle Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块。 1234pip install bottleeasy_install bottleapt-get install python-bottlewget htt…

软件测试实验二

1.百度搜索seleniumIDE,进入官网http://www.seleniumhq.org/download/下载区下载软件 2.使用seleniumIDE录制脚本,打开IDE,录制脚本,并测试脚本 3.导出脚本,完成实验 转载于:https://www.cnblogs.com/wyp-run/p/661974…

计算机在管理会计应用中的作用,信息化在管理会计中的作用

信息化在管理会计中的作用在管理会计的日常工作中,需要进行大量的数据收集整理工作,会出现漏算错算等情况,加强管理会计软件的创新和研发,从而推进企业会计电算化。摘要:较比以往,信息技术不断发展,在人们的…

基于鸢尾花数据集的逻辑回归分类实践

基于鸢尾花数据集的逻辑回归分类实践 重要知识点 逻辑回归 原理简介: Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别)&#xff0c…

校办研修之计算机培训简报,“2018校本研修培训”第二期学习简报

原标题:“2018校本研修培训”第二期学习简报校训校风:博教风学风:学习提升,共约成长洛阳市第二十六中学2018年校本研修培训学习简报(第二期)素材收集:数学组、物理组、生物组制 作:郭志伟、张志刚时 间&…

Python之路 day1 基础1 变量 for while 用户输入

一、 Python介绍 python的创始人为吉多范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 最新的TIOBE排行榜&#xff…

20155302 2016-2017-2 《Java程序设计》第六周学习总结

20155302 2016-2017-2 《Java程序设计》第6周学习总结 教材学习内容总结 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,Ou…

找不到tgp饥荒专用服务器,饥荒tgp版专用服务器搭建指南_游侠网

《饥荒》很多玩家购买了tgp版,对于服务器的搭建还不熟悉。下面小编带来《饥荒》tgp版专用服务器搭建指南,一起来看吧。1.创建以下文件夹\\(我的)文档\Klei\\DoNotStarveTogetherRail\MyDediServer\\(我的)文档\Klei\\DoNotStarveTogetherRail\MyDediServ…

elementui源码_Element UI 终于还是来啦

昨天, Element Plus for Vue 3.0 Beta 版本正式发布了!对,就是那个被外界传言不再维护的Element UI!Element Plus for Vue 3.0 是一个使用 TypeScript Composition API 重构的全新项目。官方团队几乎重写了每一行 代码&#xff0…

复地邮箱服务器地址,打印服务器设置方法

现在很多人会使用打印机,打印机可以帮助我们打印一些资料,但是很多人之前可能没有使用过打印机,因此自己购买了之后发现不会使用,不会设置,今天就为您介绍一下打印服务器安装设置,希望对您有帮助。打印服务…

腐蚀rust研究台抽奖_中石化青岛安工院专家分享延迟焦化装置的腐蚀风险分析!...

延迟焦化装置的腐蚀风险分析李贵军,单广斌(中国石化青岛安全工程研究院)主要内容:对某延迟焦化装置的腐蚀情况进行了描述,根据装置的流程特点、操作条件、设备选材和结构,对装置的腐蚀类型和腐蚀原因进行了分析,提出了…

目标检测如何计算召回率_计算机视觉目标检测的框架与过程

计算机视觉个人接触机器视觉的时间不长,对于机器学习在目标检测的大体的框架和过程有了一个初步的了解,不知道对不对,如有错误,请各位大牛不吝指点。目标的检测大体框架:计算机视觉目标检测分为以下几个步骤&#xff1…

修改wap游戏服务器,修改wap游戏服务器

修改wap游戏服务器 内容精选换一换部署游戏应用前,您需要准备硬件以及华为云的环境,主要包括以下内容:硬件环境:您需要准备一台带有显卡的Windows机器,硬盘至少20G,用于运行游戏客户端。若您不需要运行游戏…

e5cc温控仪通讯参数设定_自动化工程师:施耐德 PLC常见两种编程通讯控制实例,收好不谢...

1、第一种是采用 UNTLW1协议进行联机编程:参数设置与通讯配置检查:用 Premium的专用编程电缆“TSXPCX3030-C(USB接口,有专门的驱动)”通过调试机与CPU上的TER口进行连接,连接好后,点击某单栏里的“PLC(P)”菜单&#x…

flask登录验证用ajax,基于 Ajax 请求的 Flask-Login 认证

index.htmlexample.py## index.htmlindex.html test login by Leetao未点击var load_msg function () {$.get(/hello?api_keytest_login,function(data){$(#test_login)[0].innerText data})}example.pyfrom flask import Flask, request, jsonify, render_templatefrom fla…

折叠菜单,选择下拉(手风琴)

无聊,就自己写了一个手风琴的下拉菜单,写之前要介绍以下几个JQuery函数的用法: 1.children()方法 ,表示当前元素下的子元素,函数内可以有参数,参数为“子元素”的名称。 2.slideToggle()方法,在…

零窗口探测怎么抓包_万事俱备,只待“窗口”!航天任务中的重要环节:“发射窗口”!...

1999年11月20日06时30分07秒,神舟一号腾空而起,揭开了我国载人航天的华丽篇章。2003年10月15日09时00分00秒杨利伟驾乘神舟五号成功进入太空,我国成为了世界第三个自主探寻宇宙的人类国家。载人航天工程在过去的20年间一共发射了从神舟一号到…

【手把手教你树莓派3 (二)】 启动wifi模块

概述 树莓派3内置了wifi和蓝牙模块,我们不用像以前的版本那样,再去购买一个外接的模块练到raspberry上。 当我们第一次启动了树莓派的时候,必然使用了网线,但是之后的每一次使用,我们当然更希望使用wifi连接树莓派和路…

长方形与圆最近连线LISP_餐桌到底选方还是圆?可千万别买错了,今天我们好好聊聊...

最近我被所潜装修群里一则消息刷屏了,几个人你争我夺、言辞激烈,爬楼一看原来是纠结「餐桌选圆还是方」。要说我们中国人真的是什么都能纠结起来,今天我也给大家好好聊聊餐桌究竟该怎么选!1、方桌 VS 圆桌1.方桌的特点现代家庭方桌…

python 当前时间的前一天_python中time、datetime模块的使用

python中time、datetime模块的使用1、前言如果您从事过python web的开发,那一定有过这样的经历,对于各种复杂繁琐的业务逻辑,掺杂着各种各样的时间约束,让人很容易搞的头晕眼花,比如展示出一天内用户进行过的所有操作记…