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

二叉搜索树——红黑树

红黑树

  • 概念
  • 红黑树的原理
  • 红黑树的效率
  • 红黑树的插入规则
    • 变色
    • 旋转+变色
    • 红黑树的验证
  • 代码如下

概念

红黑树本质也是一颗二叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。
红黑树与AVL树相比对于平衡的要求更加宽松,也就是说红黑树相比于AVL树是少了很多旋转的过程。
红黑树的创建需要遵循以下四个规则

  1. 每个结点不是红⾊就是⿊⾊
  2. 根结点是⿊⾊的
  3. 如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是⿊⾊的,也就是说任意⼀条路径不会有连续的红⾊结点。
  4. 对于任意⼀个结点,从该结点到其所有NULL结点的简单路径上,均包含相同数量的⿊⾊结点。
    在这里插入图片描述
    注意:第四点是要求到所有的NULL结点而不是叶子结点,因此在《算法导论》中,其将所有的NULL结点写成黑色的NIL。

在这里插入图片描述

红黑树的原理

红黑树是如何确保最长路径不超过最短路径的两倍的?

  1. 由规则4可知,从根到NULL结点的每条路径都有相同数量的⿊⾊结点,所以极端场景下,最短路径就就是全是⿊⾊结点的路径,假设最短路径⻓度为bh(black height)。
  2. 由规则2和规则3可知,任意⼀条路径不会有连续的红⾊结点,所以极端场景下,最⻓的路径就是⼀⿊⼀红间隔组成,那么最⻓路径的⻓度为2*bh。
  3. 综合红⿊树的4点规则⽽⾔,理论上的全⿊最短路径和⼀⿊⼀红的最⻓路径并不是在每棵红⿊树都存在的。假设任意⼀条从根到NULL结点路径的⻓度为x,那么bh <= h <= 2*bh。

红黑树的效率

如果N是红黑树的结点,h是最短路径长度,所以2h<=N<22*h-1,所以时间复杂度约为logN

红黑树的插入规则

变色

首先,插入的结点一定是红色的,因为这才不会改变整体每条路径上的黑色结点数目,这里就需要进行分类了

  1. parent直接为黑色,直接插入红色结点即可。
  2. parent为红色,由于不能有连续的红色结点,所以需要将parent变为黑色,但由于需要保证黑色结点数目不变,这里如果uncle存在且为红,就将parent与uncle都变为黑色,同时将grandparent变为黑色。
    这两种情况只需要进行变色处理而不用旋转

旋转+变色

如果uncle存在且为黑色或者uncle不存在,那就需要进行旋转+变色,如果是这样

//		g
//   p		u
// c
//或者
// 		g
//	 p
//c

就进行右单旋+变色,将parent变为黑色,grandparent变为红色,其余情况就不一一列举,有右单旋+变色,有双旋+变色,旋转的情况和AVL其中一样。

红黑树的验证

验证该树是不是红黑树,其实只需要判断每条路径上面的黑色结点是否相同即可

代码如下

红黑树

http://www.xdnf.cn/news/744733.html

相关文章:

  • WIFI中2.4G和5G的区别,和WiFi5,WiFi6和WiFi7的区别,
  • 【C++】模板
  • JWT 原理与设计上的缺陷及利用
  • 数据库-MySQL索引事务
  • 深入理解MCP模型协议:构建全能AI服务端
  • 计算机视觉与深度学习 | 基于Matlab的门禁指纹识别与人脸识别双系统实现
  • 【项目】在线OJ(负载均衡式)
  • (新)MQ高级-MQ的可靠性
  • AI炼丹日志-25 - OpenAI 开源的编码助手 Codex 上手指南
  • git 之 stash
  • Git -> Git Stash临时保存当前工程分支修改
  • 第二十章 文本处理
  • 深入解析C#多态性:基类引用、虚方法与覆写机制
  • 字符串索引、幻读的解决方法
  • Pytorch---ImageFolder
  • C++ 的四种强制类型转换:static_cast、dynamic_cast、const_cast 和 reinterpret_cast
  • MIT 6.S081 2020 Lab6 Copy-on-Write Fork for xv6 个人全流程
  • 修改 vscode 左侧导航栏的文字大小 (更新版)
  • Cursor奇技淫巧篇(经常更新ing)
  • # STM32F103 串口打印配置(HAL库)
  • foundationpose位姿检测环境搭建与数据集制作
  • Android任务栈管理策略总结
  • 蓝桥杯 盗墓分赃2
  • Deepin 23.10安装Docker
  • Go语言中的布尔类型详解
  • 截面动量策略思路
  • 内存管理 : 04段页结合的实际内存管理
  • Muduo网络库重点技术详解
  • tomcat服务器以及接受请求参数的方式
  • Java网络编程实战:TCP/UDP Socket通信详解与高并发服务器设计