平衡二叉树(AVL树)原理

1、平衡二叉树(AVL树)

平衡二叉树也称之为AVL树,是一个具有以下特征的二叉搜索树:

1、左子树和右子树高度差不会大于1

2、左右两颗子树都满足第一个条件。

1.1、满足条件的AVL树

以下树,左边的高度为3,右边的高度为2,高度差为1,满足条件。

1.2、不满足条件的AVL树

以下树,左边的高度为4,右边的高度为2,高度差大于1,不满足条件。

1.3、为什么需要平衡二叉树

平衡二叉树是为了提高二叉树的查询速度。如果没有平衡二叉树,当我们给有序数据排序时,会产生一颗斜树,斜树是单链结构,失去查询速度快的优势。下面生成一颗斜树。

从图中可以看出,左斜树或者右斜树像是一个链表,插入和删除的速度依旧较快,但是查询的速度较慢,因为遍历深度更深,需要消耗更多的磁盘I/O操作。这个时候我们可以对其进行改造。

1.4、改造之后的二叉树

这个时候我们可以看出,平衡二叉树有了左子树和右子树,树的高度发生了变化,查询时候的磁盘I/O开销更小,速度更快。

1.5、平衡二叉树需要进行左旋转操作和右旋转操作

平衡二叉树需要满足:左子树和右子树高度差不会大于1,如果大于1这个时候需要进行左旋转或右旋转。如下图二叉树就需要进行左旋转操作。

2、平衡二叉树左旋转或右旋转规则

右旋转相反,不做过多的阐述。

2.1、平衡二叉树左旋转

2.1.1、左旋转过程

1、获取当前二叉树的根节点,作为新节点并创建节点

2、获取当前二叉树的左子树,作为新节点的的左子树。

3、获取当前二叉树根节点的右子树的左节点,作为新节点的右子树。

4、获取当前二叉树右节点的值,作为新树的根节点。

5、获取当前二叉树右节点的右子树,作为新二叉树的右子树

3、平衡二叉树需要双旋转的情况

案例中为了跟上面的案例达到一脉相承的效果,写了一个4.1,比较突兀,就是为了满足条件,大家可以使用权限的数字替代也行。

3.1、双旋转过程

双旋转是基于单旋转(左旋、右旋),其只是对单旋转的代码调用,通过代码来理解双旋转即可。

双旋转代码的核心思想在于:在创建二叉树的过程中,每次添加新的节点,都要判断一下该二叉树是否需要旋转。

如果二叉树需要左旋,则先判断根节点的右子节点的左子树高度是否大于右子树的高度,如果大于则先对根节点的右子树进行右旋,最后再对原二叉树进行左旋;

如果二叉树需要右旋,则先判断根节点的左子节点的右子树高度是否大于左子树的高度,如果大于则先对根节点的左子树进行左旋,最后再对原二叉树进行右旋。

3.2、解决上述问题

我们可以在对原二叉树右旋之前,将其右子树(以 6 为根节点的树)进行一次右旋即可。

然后再对整颗树进行左旋转

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Azure 学习总结

文章目录 1. Azure Function1.1 Azure Function 概念1.2 Azure Function 实现原理1.3 Azure Function 本地调试1.4 Azure Function 云部署 2. Azure API Managment 概念 以及使用2.1 Azure API 概念2.2 Azure API 基本使用 3. Service Bus 应用场景及相关特性3.1 Service Bus 基…

使用Microsoft托管密钥的Azure信息保护云退出

由于各种原因,一些组织需要一个明确定义的流程来停止使用 Azure 信息保护以及对云服务的任何依赖,而不会在采用之前失去对其数据的访问权限 - 以便在出现需要时做好准备。 Azure 信息保护 (AIP) 为使用自带密钥 (BYOK) 的客户和使用 Microsoft 托管密钥…

数字市场绽放:探秘跨境电商的未知世界

随着全球数字化浪潮的涌动,跨境电商在数字市场中迎来了绚烂的绽放。这个未知的世界不仅是商业的前沿,更是技术、创新与全球化融合的产物。本文将深入探讨跨境电商的独特之处,从数字市场的角度揭示其未知世界的奥秘。 跨境电商的定义与演变 跨…

76 Python开发-内外网收集Socket子域名DNS

目录 Python开发相关知识点本篇文章涉及知识点演示案例:IP&Whois&系统指纹获取代码段-外网CDN&子域名&端口扫描&交互代码段-外网IP&计算机名&存活主机&端口扫描代码段-内网Py格式解析环境与可执行程序格式转换-Pyinstaller 涉及资源&#xff1…

记一次应急响应练习(Linux)

记一次应急响应练习(Linux) Linux: 请提交攻击者的IP地址 答: 192.168.31.132 思路: 通过查看历史命令和开放的8080端口看到这台主机上运行的是Tomcat服务。并且在历史命令中看到了Tomcat的安装路径。那么就算是找到了日志的查看点了&#x…

第18章程序设计

Swing程序设计 Swing用于开发桌面窗体程序用于JDK的第二代GUI框架,其功能比JDK第一代GUI框架AWT更为强大,性能更加优良。但因为Swing技术推出时间太早,七性能,开发效率等不及一些其他的留下技术,所以目前市场大多数桌面…

专题四:前缀和

前缀和 一.一维前缀和(模板):1.思路一:暴力解法2.思路二:前缀和思路 二. 二维前缀和(模板):1.思路一:构造前缀和数组 三.寻找数组的中心下标:1.思路一:前缀和 四.除自身以外数组的乘积&#xff…

留言板(Mybatis连接数据库版)

目录 1.添加Mybatis和SQL的依赖 2.建立数据库和需要的表 3.对应表中的字段,补充Java对象 4.对代码进行逻辑分层 5.后端逻辑代码 之前的项目实例【基于Spring MVC的前后端交互案例及应用分层的实现】https://blog.csdn.net/weixin_67793092/article/details/134…

drf知识-08

Django之了解DRF框架 # 介绍:DRF全称 django rest framework # 背景: 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的 增:校验请…

第三课:寄存器与内存、中央处理器(CPU)、指令和程序及高级 CPU 设计

第三课:寄存器与内存、中央处理器(CPU)、指令和程序及高级 CPU 设计 第六章:寄存器与内存课程导入1、概念梳理2、锁存器3、门锁4、寄存器5、门锁矩阵5、内存 第七章:中央处理器(CPU)1、概念梳理…

Illustrator脚本 #015 自动角线

这是一个在画板上自动生成辅助线和角线的脚本,只要单击最右边按钮运行脚本即可。 绿色的为参考线及出血线。 #target "Illustrator" var settings = {addTrim : true,addBleedGuide : true,addCenterGuide : true,addCover : false,overlapAlert : false,trimma…

WEB 3D技术 three.js 设置环境贴图 高光贴图 场景设置 光照贴图

上文WEB 3D技术 three.js 基础网格材质演示几何体贴图 ao贴图效果我们简单构建了一个贴图和ao贴图的几何体材质 我们接下来 来看一下透明度贴图 我们还是官网搜索 MeshBasicMaterial 然后 是我们的 alphaMap 属性 这里 黑色为完全透明 白色 完全不透明 黑白之间还有灰色 这个灰…

【数据库系统概论】第6章-关系数据库理论

真别看吧,抄ppt而已啊 文章目录 6.1 引言6.2 规范化6.2.1 函数依赖6.2.2 码6.2.3 范式(Normal Form)6.2.4 BC范式6.2.5 规范化小结 6.1 引言 我们有这样一张表: but 为啥这样设计呢?由此引出怎样设计一个关系数据库…

Mac电脑如何长截图?

https://zhuanlan.zhihu.com/p/543012365 1、打开需要截图的网页(小编随意输入的内容),如图 2、按下组合快捷键【commandoptioni】,出现“html”界面,如图 3、按下组合快捷键【commandshiftp】,出现搜索界…

使用激光干涉测量时克服振动问题

干涉仪的工作原理 干涉仪可以极其精确地测量物体。他们的工作原理是使用分束器将一束光分成相等的两半,分束器实际上是一块涂有薄银的玻璃。当光照射到分束器上时,一半的光通过,一半的光被反射回来。其中一束光束(称为参考光束&a…

软件测试常见的面试题,这些题面试前看提高百分之60的通过率

01、您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答:有黑盒和白盒两种测试种类,黑盒有等价类划分法,边界分析法,因果图法和错误猜测法。白盒有逻辑覆盖法&…

Ubuntu18.04安装GTSAM库并验证GTSAM是否安装成功(亲测可用)

在SLAM(Simultaneous Localization and Mapping)和SFM(Structure from Motion)这些复杂的估计问题中,因子图算法以其高效和灵活性而脱颖而出,成为图模型领域的核心技术。GTSAM(Georgia Tech Smo…

关于Redis面试题

前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv Redis 是什么 全名:远程字典服务。这是一个开源的在内存中的数据结构存…

C#高级 01.Net多线程

一.基本概念 1.什么是线程? 线程是操作系统中能独立运行的最小单位,也是程序中能并发执行的一段指令序列线程是进程的一部分,一个进程可以包含多个线程,这些线程共享进程资源进程有线程入口,也可以创建更多的线程 2.…

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…