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

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

红黑树是平衡二叉树的一个变种。

一、 产生平衡二叉树的原因。

二叉搜索树的问题在于极端场景下退化为类似链表的结构,所以搜索的时间复杂度就变成了O(N)。为了保证二叉树不退化为链表,我们必须保证二叉树的的平衡性。

二叉平衡搜索树就是解决上面的问题的。就是AVL树和红黑树

拓展就是多叉平衡二叉树,那就是B树系列。然后哈希表也可以搜索。

二、二叉平衡树的概念。

当二叉搜索树中插入新节点后,如果能保证每个节点的左右子树高度只差的绝对值不超过1.即可降低树的高度,从而减少平均搜索的长度

一棵AVL树或者空树,或者是具有以下性质的二叉搜索树

它的左右子树都是AVL树,左右子树高度之差(平衡因子)的绝对值不超过1。增删查改:高度次 -O(logN)

三、平衡二叉树的插入。

在插入时,我们可以先构造二叉搜索树。然后再进行平衡操作。

1、新增在左边,parent平衡因子要减减

2、新增在右边,parent平衡因子要加加

3、更新后parent平衡因子==0,说明parent所在的子树的高度不变,不会影响祖先,不用再继续沿着到root的路径往上更新。插入完成

4、更新后parent平衡因子==负1or1,说明parent所在的子树的高度变化,会影响祖先,再继续沿着到root的路径往上更新。

5、更新后parent平衡因子 == 2or负2,说明parent所在的子树的高度变化且不平衡。对parent所在子树进行旋转,让它平衡。插入结束。

 6、更新到根节点也是一种插入结束的情况。那么如何进行平衡呢   

我们这里需要用到旋转平衡。

旋转的时候需要注意的问题。

1、保持它是搜索树

2、变成平衡树且降低整棵树的高度

左单旋:

核心操作就是parent->right = cur->left;cur->left = parent; 

这么做的原因是:cur->left一定比parent要大。然后放在parent的右边是符合搜索树的定义的。

 

注意要修改父亲,还要注意curleft为空的情况。修改平衡因子。还有要把子树跟原来的树连接

如果是独立的树 parent  == _root,进行parent->_parent置空。

如果不是独立的树我们需要对parent->_parent进行保存为ppnode,然后进行判断子树是属于ppnode的左子树还是右子树修改ppnode的左右子树为cur,然后修改cur的父亲指针。

抽象图的解释:

插入之前abc为符合AVL规则的子树。 无论是哪种情况,我们的旋转过程是不变的。插入前的AVL树有无数种情况,我们需要使用抽象图来表示。

双旋:

分为先左后右,先右后左

上面只是先右后左的图片。

相关文章:

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

红黑树是平衡二叉树的一个变种。 一、 产生平衡二叉树的原因。 二叉搜索树的问题在于极端场景下退化为类似链表的结构,所以搜索的时间复杂度就变成了O(N)。为了保证二叉树不退化为链表,我们必须保证二叉树的的平衡性。 二叉平衡搜索树就是解决上面的问…...

【Qt问题】windeployqt如何提取Qt依赖库

往期回顾 【Qt问题】Qt Creator 如何链接第三方库-CSDN博客 【Qt问题】Qt 如何带参数启动外部进程-CSDN博客 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式-CSDN博客 【Qt问题】windeployqt如何提取Qt依赖库 考虑这个问题主要是:当我们的程序运行好之后&#…...

VS2019下使用MFC完成科技项目管理系统

背景: (一)实验目的 通过该实验,使学生掌握windows程序设计的基本方法。了解科技项目组织管理的主要内容和管理方面的基本常识,熟练应用数据库知识,通过处理过程对计算机软件系统工作原理的进一步理解&…...

【Android】Kotlin学习之数据容器(数组for循环遍历)

数组遍历 1. for ( item in arr){…} 2. for ( i in arr.indeces ) {…} (遍历下标) 3. for ((index, item) in arr.withInfex()) {…} (遍历下标和元素) 4. arr.forEach {} ( 遍历元素 ) 5. arr.forEachIndexed{index, item -> …}...

JavaWeb_请求响应_简单参数实体参数

一、SpringBoot方式接收携带简单参数的请求 简单参数:参数名与形参变量名相同,定义形参即可接收参数。并且在接收过程中,会进行自动的类型转换。 启动应用程序后,在postman中进行测试: 请求成功,响应回了O…...

windows端口复用

1. 概述 使用 HTTP.sys 中的 Net.tcp Port Sharing 服务,配合 WinRM 实现端口复用。 优点: HTTP.sys 为 windows 原生机制, WinRM 为 windows 自带功能,动作较小,不易触发主 动防御。 需要管理员权限。 2. 原理 (…...

[Redis] 使用布隆过滤器和分布式锁实现用户注册

布隆过滤器(Bloom Filter)是一种数据结构,用于快速判断一个元素是否可能存在于一个集合中。它通过使用多个哈希函数和一个位数组来表示一个集合,当一个元素被加入到集合时,通过哈希函数计算出多个哈希值,并…...

Okhttp 发送https请求,忽略ssl认证

工具类 import lombok.extern.slf4j.Slf4j;import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509Tru…...

IT项目管理-大题【太原理工大学】

一、根据进度网络写出时间参数表、关键路径、总工期 此类题一般是给一个表,问三问。 第一问会问某个活动的时间参数,但我们需要把整个表都求出来,否则单求一个很困难(如果你就是不想求整张表也行,不是硬性要求&#xf…...

【代码随想录】day48

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、198打家劫舍二、213打家劫舍II三、337打家劫舍III 一、198打家劫舍 class Solution { public:int rob(vector<int>& nums) {vector<int> dp(n…...

【补充】1-auth的使用、扩写auth的user表、django支持缓存

1 Auth的使用 1.1 扩写auth的user表 2 缓存 1 Auth的使用 # django 的一个app---》用户的登录&#xff0c;退出&#xff0c;注册。。。# 配置文件中配置&#xff1a;---》表会被迁移INSTALLED_APPS [django.contrib.auth,]# auth有哪些表---权限控制&#xff1a;-Permission&a…...

力扣-21. 合并两个有序链表-js实现

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} list1* param {ListNode} list2* return {ListNode}*/ const mergeTwoList…...

tensorflow报错

参考 TensorFlow binary is optimized to use available CPU instructions in performance-critical operations._this tensorflow binary is optimized to use availab-CSDN博客 解决Python中cuBLAS插件无法注册问题_unable to register cudnn factory: attempting to re-CS…...

企业数字化转型走向平台化运营会经历哪些阶段?

蚓链实践总结企业数字化转型走向平台化运营通常会经历以下几个阶段&#xff1a; 1. 规划与准备阶段&#xff1a;明确转型目标和战略&#xff0c;评估现有业务和技术状况&#xff0c;制定转型计划。 2. 基础建设阶段&#xff1a;搭建数字化基础设施&#xff0c;包括云平台、数…...

最新AI实景自动无人直播软件教你实现24小时不下播带货;智能化引领直播新时代

随着互联网的快速发展&#xff0c;直播行业已经成为商家品牌推广和商品销售的热门方式。而如今&#xff0c;一款令人惊叹的AI实景自动无人直播软件正在让直播变得更加智能化和便捷化&#xff0c;为商家带来全新的直播体验。 AI实景自动无人直播软件的一大优势是其智能讲解功能。…...

《二十一》QT QML编程基础

QML概述 QML&#xff08;Qt Meta-Object Language&#xff09;是一种声明性语言&#xff0c;它被用于描述Qt框架中用户界面的结构和行为。QML提供了一种简洁、灵活的方式来创建动态和交互式的界面。 QML基于JavaScript语法&#xff0c;通过使用QML类型和属性来定义界面的元素…...

免费的发票查验接口平台 PHP开发示例

信息爆炸的时代&#xff0c;发票管理工作也在不断走向数字化管理。传统手动录入的方式不仅耗时长&#xff0c;繁琐低效&#xff0c;且容易出现人为错漏的风险&#xff0c;让财务工作者头疼不已。人工智能时代&#xff0c;翔云推出了发票识别发票查验接口&#xff0c;以此来助力…...

10、算数运算符(以 ‘/’、‘%’、‘++’为主去讲解)(Java超详细版本)

算数运算符 一、算数运算符二、“ / ”的使用三、“ % ”的使用四、“ ”的使用⭐ 一、算数运算符 算数运算符是对数值类型的变量进行运算的&#xff0c;在Java程序中使用的非常多的。 二、“ / ”的使用 1、Java中 “ / ” 的运算结果是省略小数部分的整数&#xff0c;不存…...

向量数据库:PGVector

一、PGVector 介绍 PGVector 是一个基于 PostgreSQL 的扩展插件&#xff0c;为用户提供了一套强大的向量存储和查询的功能&#xff1a; 精确和近似最近邻搜索单精度&#xff08;Single-precision&#xff09;、半精度&#xff08;Half-precision&#xff09;、二进制&#xff…...

redux实现原理

Redux 是一个用于 JavaScript 应用程序状态管理的库。它被设计用来管理整个应用程序的状态&#xff0c;并且与 React 结合使用时非常流行。Redux 的实现原理可以简要概括为以下几个关键概念&#xff1a; 单一数据源 (Single Source of Truth)&#xff1a;Redux 应用程序的所有状…...

原来Ilya还有70亿美元OpenAI股权

鹭羽 发自 凹非寺量子位 | 公众号 QbitAI马斯克 VS 奥特曼的世纪庭审&#xff0c;也太劲爆了——感觉自己像是瓜田里的猹&#xff0c;一瓜未平一瓜又起。吃不过来&#xff0c;根本吃不过来……这不&#xff0c;就在刚刚&#xff0c;OpenAI的造富神话被「一不小心」炸了出来。Op…...

Avogadro 2:开源分子可视化库的终极技术解析

Avogadro 2&#xff1a;开源分子可视化库的终极技术解析 【免费下载链接】avogadrolibs Avogadro libraries provide 3D rendering, visualization, analysis and data processing useful in computational chemistry, molecular modeling, bioinformatics, materials science,…...

连接器选型五大雷区:从故障数据到设计落地的实战手册

许多硬件团队的失效分析报告显示&#xff0c;连接器引发的现场故障占比长期居高不下&#xff0c;且症状极其隐蔽——间歇性黑屏、信号丢包、热插拔烧毁……这些问题往往在原型测试阶段难以复现&#xff0c;直到批量出货后才集中爆发。本文从电源、高速信号、射频三类典型应用出…...

如何快速将Figma设计文件转换为结构化JSON数据:完整指南

如何快速将Figma设计文件转换为结构化JSON数据&#xff1a;完整指南 【免费下载链接】figma-to-json &#x1f4be; Read/Write Figma Files as JSON 项目地址: https://gitcode.com/gh_mirrors/fi/figma-to-json 在当今的设计开发工作流中&#xff0c;Figma已成为UI/UX…...

从零到一:在Windows Server上快速部署OpenLDAP服务与客户端连接实战

1. 为什么选择OpenLDAP&#xff1f; 如果你正在管理一个中小型企业的IT基础设施&#xff0c;用户账号管理可能会让你头疼。每次有新员工入职&#xff0c;都要在每台电脑上创建账号&#xff1b;员工离职时又要逐个删除权限。这种重复劳动不仅效率低下&#xff0c;还容易出错。Op…...

别再为答辩 PPT 秃头了!PaperXie 的 AI PPT 功能,让你把时间花在更重要的地方

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 距离毕业论文答辩只剩半个月&#xff0c;你的 PPT 还停留在 “空白文档” 阶段吗&#xff1f; 我见过太多同学在这个阶段陷…...

Arccos Golf数据获取与Python分析实战:开源工具包逆向工程API

1. 项目概述&#xff1a;一个高尔夫数据爱好者的开源工具箱 如果你和我一样&#xff0c;既是个高尔夫爱好者&#xff0c;又对数据分析和自动化工具着迷&#xff0c;那么你很可能听说过Arccos Golf这个平台。它是一个通过传感器和手机应用来追踪每一次击球、分析球场表现的系统。…...

Android MediaProjection实战:从权限适配到异常处理,构建Android Q+的稳定截屏录屏功能

1. 理解MediaProjection的核心机制 在Android Q及以上版本中&#xff0c;MediaProjection API是系统级截屏和录屏功能的唯一官方入口。与早期版本直接调用adb screencap或反射获取Surface不同&#xff0c;这套机制通过用户显式授权的方式实现隐私保护。我曾在多个项目中遇到过因…...

Verilog与SystemVerilog在Arm Cycle Model Compiler中的支持与优化

1. Verilog与SystemVerilog语言支持概述 作为数字电路设计的行业标准语言&#xff0c;Verilog和SystemVerilog在半导体领域占据着核心地位。Arm的Cycle Model Compiler 11.5版本对这两种语言提供了全面的支持&#xff0c;但在实际工程应用中&#xff0c;开发者需要特别注意不同…...

死锁四大必要条件解析

好的&#xff0c;针对“死锁考点与高频面试题”&#xff0c;我将直接进行核心内容解构与推演&#xff0c;并生成符合规范的答案。死锁是多线程并发编程中的核心难点与高频考点&#xff0c;其核心围绕定义、条件、场景、检测、预防与避免展开。一、 死锁核心定义与必要条件死锁是…...