当前位置: 首页 > news >正文

平衡二叉树旋转

  首先附上本文节选地址:http://www.cnblogs.com/huangxincheng/archive/2012/07/22/2603956.html

 

  二叉查找树不是严格的O(logN),导致了在真实场景中没有用武之地,谁也不愿意有O(N)的情况发生,作为一名码农,肯定会希望能把“范围查找”做到地球人都不能优化的地步。 当有很多数据灌到我的树中时,我肯定会希望最好是以“完全二叉树”的形式展现,这样我才能做到“查找”是严格的O(logN),比如把这种”树“调正到如下结构。

     

这里就涉及到了“树节点”的旋转,也是我们今天要聊到的内容。

 

一:平衡二叉树(AVL)

1:定义

       1、父节点的左子树和右子树的高度之差不能大于1,也就是说不能高过1层,否则该树就失衡了,此时就要旋转节点,在

编码时,我们可以记录当前节点的高度,比如空节点是-1,叶子节点是0,非叶子节点的height往根节点递增,比如在下图

中我们认为树的高度为h=2。

  2、它的左子树和右子树都是平衡二叉树。

2:旋转

    节点再怎么失衡都逃不过4种情况,下面我们一一来看一下。

① 左左情况(左子树的左边节点)

我们看到,在向树中追加“节点1”的时候,根据定义我们知道这样会导致了“节点3"失衡,满足“左左情况“,可以这样想,把这

棵树比作齿轮,我们在“节点5”处把齿轮往下拉一个位置,也就变成了后面这样“平衡”的形式,如果用动画解释就最好理解了。

 

② 右右情况(右子树的右边节点)

同样,”节点5“满足”右右情况“,其实我们也看到,这两种情况是一种镜像,当然操作方式也大同小异,我们在”节点1“的地方

将树往下拉一位,最后也就形成了我们希望的平衡效果。

 

③左右情况(左子树的右边节点)

从图中我们可以看到,当我们插入”节点3“时,“节点5”处失衡,注意,找到”失衡点“是非常重要的,当面对”左右情况“时,我们将

失衡点的左子树进行"右右情况旋转",然后进行”左左情况旋转“,经过这样两次的旋转就OK了,很有意思,对吧。

 

④右左情况(右子树的左边节点)

这种情况和“情景3”也是一种镜像关系,很简单,我们找到了”节点15“是失衡点,然后我们将”节点15“的右子树进行”左左情况旋转“,

然后进行”右右情况旋转“,最终得到了我们满意的平衡。

转载于:https://www.cnblogs.com/qiumingcheng/p/4738661.html

相关文章:

  • 用XPath和XSLT来更好的处理XML
  • sublime text3主题透明
  • JAR文件包及jar命令详解
  • String和Integer的特例
  • 卸载 Microsoft SQL Server 2008(亲身实践过的,完全可以卸载干净!)
  • Java项目打包工具安装失败解决方法
  • phpstorm+Xdebug断点调试PHP
  • java项目使用exe4j打包成exe文件
  • Express框架使用以及数据库公共操作类整理(Win7下的NodeJs)
  • Java对于私有变量的“暴力反射”技术
  • Java相关书籍推荐
  • Java在利用反射条件下替换英文字母中的值
  • sql server 2008如何导入mdf,ldf文件
  • Servlet 中文乱码问题及解决方案剖析
  • 4、模拟器中文输入
  • $translatePartialLoader加载失败及解决方式
  • “大数据应用场景”之隔壁老王(连载四)
  • 2017年终总结、随想
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CSS中外联样式表代表的含义
  • JavaScript 奇技淫巧
  • JS变量作用域
  • spring-boot List转Page
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 关于List、List?、ListObject的区别
  • 聊聊sentinel的DegradeSlot
  • 一文看透浏览器架构
  • 由插件封装引出的一丢丢思考
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​iOS实时查看App运行日志
  • #Linux(权限管理)
  • #LLM入门|Prompt#3.3_存储_Memory
  • (7)STL算法之交换赋值
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)大型网站的系统架构
  • .Net Core 中间件验签
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net 反编译_.net反编译的相关问题
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET连接数据库方式
  • [ C++ ] STL_list 使用及其模拟实现
  • []指针
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [CISCN2019 华东北赛区]Web2