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

理解红黑树

红黑树

  • 二叉树
  • avl树
  • 2-3-4树
  • 红黑树

以下全是根据视频学习后的个人理解和笔记。。。视频链接

红黑树可以理解为由234树演变而来,234树是由二叉查找树演变而来,二叉查找树由二叉树演变来,所以想要了解红黑树要了解二叉树和234树

二叉树

二叉树:即每个子节点只有两个节点的树
二叉查找树:也是一个二叉树,只不过二叉查找树的左节点都比其父节点小,右节点都比父节点大。其高度决定了他的效率
二叉查找树的效率也与插入顺序有关如:
插入顺序为 5、3 、2、4、7、6、8,可以如下所示
在这里插入图片描述
但是若插入顺序为 2、3、4、5、6、7、8,则是如下所示
在这里插入图片描述

插入的顺序决定了其深度,而深度又决定了查找的效率。(可以将所有的节点投影到X轴上会发现其已经是顺序排列(即将树压平),如下:)
在这里插入图片描述

①查询:查找的时候从根节点开始,当前节点比查找的值小就向右搜索,比查找的值大就向左搜索
②插入:插入的时候也是,从根节点开始与左右子树进行比较,当左子树或右子树为空的时候插入到对应的空位置
③遍历:即左根右(前序遍历)、根左右(中序遍历,常用)、左右根(后序遍历)
前驱节点:当前节点左子树中的最大值
后驱节点:当前节点右子树中的最小值
如上图1所示,5的前驱节点是4,后驱节点是6
④删除:删除当前节点的话则使用该节点的前驱节点或者后驱节点代替(即将树压平后该节点相邻的节点)。若没有前驱节点和后驱节点直接删除即可

avl树

由上述的二叉查找树可知,其插入顺序不一样会导致其查找效率不同。最坏的情况下相当于一个链表。
基于该问题,出现了平衡查找二叉树,平衡树插入和删除的时候,会通过旋转来将高度保持在LogN。其中具有代表性的平衡树有avl树和红黑树
avl树 是高度平衡树,具备二叉搜索树的全部性质,其左右子树的高度差不超过 1 .
①如何旋转:当左右子树高度差高过一的时候进行左旋或者右旋,如下所示

旋转前
在这里插入图片描述
右旋后
在这里插入图片描述
旋转前

在这里插入图片描述
右旋后
在这里插入图片描述

2-3-4树

2-3-4树是四阶的B树,(即最多有四个子节点),属于一种多路查找树.
其所有的叶子结点都拥有相同的深度.节点只能是2节点,3节点,4节点之一
2节点:包含一个元素的节点,有两个子节点.
在这里插入图片描述

3节点:包含两个元素的节点.有三个子节点
在这里插入图片描述

4节点:包含三个元素的节点,有四个子节点
在这里插入图片描述
所有节点至少必须包含一个元素

二三四树保持着二叉查找树的性质,但是其用代码实现起来不方便,所以一般使用它同等的红黑树
典型的2-3-4树,如下所示
在这里插入图片描述
二三四树的插入和二叉查找树不同(二叉查找树是从顶部向下插入),二三四树是从底部向上插入.他会先满足四节点,再向三节点和二节点演化.
如:插入过程如下:
先插入2
在这里插入图片描述
再插入 3
在这里插入图片描述

再插入 4
在这里插入图片描述
这时候的 2,3,4已经满足了四节点
再插入5
由于当前已经满足四节点所以再次插入的时候会将以前的四节点从中间拆散,中间的数向上提,插入的数和并起来,如下图所示
在这里插入图片描述
再插入 6 , 现在会先根据二叉查找树的性质,即左子树小于当前节点,右子树大于当前节点,找到合适的位置后插入,如下
在这里插入图片描述
再插入 7 ,过程如下
在这里插入图片描述
再插入 8
在这里插入图片描述
再插入 9
在这里插入图片描述
再插入10
在这里插入图片描述
再插入 11
在这里插入图片描述
将其压平后
在这里插入图片描述

红黑树

红黑树起源于二三四树,本质就是二三四树
其对应关系如下所示:
在这里插入图片描述
概念:红黑树是一种节点带有颜色属性的二叉查找树。有如下性质

  • 节点是红色或者黑色
  • 根是黑色
  • 所有叶子节点都是黑色
  • 每个红色节点必须有两个黑色子节点
  • 从任一节点到其每个叶子节点的所有简单路径都包含相同数目的黑色节点

常见操作

  • 变色 :节点由黑变红或者由红变黑
  • 旋转:
    1. 右旋:以某个节点A作为旋转点,A节点的左子节点变为父节点,左子节点的右子节点变为A节点的左子节点,右子节点保持不变。
      在这里插入图片描述
    2. 左旋:以某个节点A作为旋转节点,A节点的右子节点作为父节点,右子节点的左子节点变为A节点的右子节点,左子节点保持不变。(图可以看作右旋反过来即可)
  • 插入
    插入节点:
    情况以及对比2-3-4树图示:
  1. 当是第一个节点,不需要合并的时候
    在这里插入图片描述

  2. 再新增一个节点,即为两个节点的时候
    在这里插入图片描述

  3. 再新增一个节点,即为三个节点的时候
    在这里插入图片描述

  4. 再新增一个节点,即为四个节点的时候,此时需要分裂
    在这里插入图片描述

  • 删除
    删除节点

删除节点就是将这个节点的前驱节点或者后驱节点的值赋给给节点,即替换该节点,然后再删除前驱节点或者后驱节点。

相关文章:

  • 【精通内核】CPU控制并发原理CPU中断控制
  • 牛客 NC208246 胖胖的牛牛
  • 源码安装nginx及其配置
  • Vue element-ui表格嵌进度条
  • 前后数据传输协议规范
  • Unions
  • 基于springboot的地质灾害应急管理系统
  • Structures
  • 向量数据库入坑指南:聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss
  • 电子邮件营销新趋势-自动化
  • ICT产业关联效应的国际比较——基于投入产出的分析
  • 【algorithm】算法学习----堆
  • Q_ENUM Q_ENUMS Q_ENUM_NS Q_FLAG Q_FLAGS Q_FLAG_NS
  • 国外5G行业应用产业政策分析及对我国的启示
  • 【C语言】文件输入输出操作
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [译]CSS 居中(Center)方法大合集
  • Apache Pulsar 2.1 重磅发布
  • Brief introduction of how to 'Call, Apply and Bind'
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • ERLANG 网工修炼笔记 ---- UDP
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java 最常见的 200+ 面试题:面试必备
  • Java反射-动态类加载和重新加载
  • JSONP原理
  • JS题目及答案整理
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • SOFAMosn配置模型
  • vagrant 添加本地 box 安装 laravel homestead
  • WePY 在小程序性能调优上做出的探究
  • 回流、重绘及其优化
  • 基于Android乐音识别(2)
  • 浏览器缓存机制分析
  • 前端临床手札——文件上传
  • 提醒我喝水chrome插件开发指南
  • 微信小程序--------语音识别(前端自己也能玩)
  • 温故知新之javascript面向对象
  • 用Visual Studio开发以太坊智能合约
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​TypeScript都不会用,也敢说会前端?
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)选择元素——(17)练习(Exercises)
  • (第一天)包装对象、作用域、创建对象
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (三)Honghu Cloud云架构一定时调度平台
  • ****Linux下Mysql的安装和配置
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .Net 路由处理厉害了
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net(C#)自定义WinForm控件之小结篇
  • .sdf和.msp文件读取
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码