【C++学习篇】红黑树 从入门到进阶

news/2025/1/16 0:59:55/

目录

1.红黑树的概念

1.1红黑树的规则

1.2红黑树的效率

2. 红黑树的实现

2.1 红黑树的结构

2.2红黑树的插入

2.2.1红黑树插入,旋转的一些细节

2.2.1.1 u(uncle)不存在 ,c为p的左孩子(单旋+变色)

 2.2.1.2 uncle存在且为黑,c为p的左孩子(单旋+变色)

2.2.1.3  u(uncle)不存在 ,c为p的右孩子(双旋+变色)

2.3插入节点的代码实现

3. 本期关于红黑树的总结:



1.红黑树的概念

红黑树是一棵二叉搜索树,但是在此基础之上,又增加了一个存储为来表示节点的颜色,可以是红色或者是黑色。通过对任意一条根到叶子的路径上的各个节点的颜色来进行约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。

1.1红黑树的规则

1.每个结点不是红⾊就是⿊⾊。

2.根结点是⿊⾊的。

3.如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是⿊⾊的,也就是说任意⼀条路径不会有连续的红⾊结点。

4. 对于任意⼀个结点,从该结点到其所有NULL结点的简单路径上,均包含相同数量的⿊⾊结点

则说明,假设一条路径有n个黑节点,且全为黑,没有红,则该条路径最短;则最长路径肯定是一黑一红交替出现,因为红节点不能连续出现,所以最长路径节点数是2n。!!最短路径和最长路劲不一定存在,我这里只是做一个讲解。

 

1.2红黑树的效率

 假设N是红⿊树树中结点数量,h最短路径的⻓度,那么 2h − 1 <= N < 22∗h − 1 , 由此推出
 h ≈ logN ,也就是意味着红⿊树增删查改最坏也就是⾛最⻓路径 2 ∗ logN ,那么时间复杂度还是
 O(logN ) 。

红⿊树的表达相对AVL树要抽象⼀些,AVL树通过⾼度差直观的控制了平衡。红⿊树通过4条规则的颜⾊约束,间接的实现了近似平衡,他们效率都是同⼀档次,但是相对⽽⾔,插⼊相同数量的结点,红⿊树的旋转次数是更少的,因为他对平衡的控制没那么严格。

2. 红黑树的实现

2.1 红黑树的结构

2.2红黑树的插入

2.2.1红黑树插入,旋转的一些细节

 前提!!!插⼊⼀个值按⼆叉搜索树规则进⾏插⼊,插⼊后我们只需要观察是否符合红⿊树的4条规则。

1. 插⼊⼀个值按⼆叉搜索树规则进⾏插⼊,插⼊后我们只需要观察是否符合红⿊树的4条规则。
2. 如果是空树插⼊,新增结点是⿊⾊结点。如果是⾮空树插⼊,新增结点必须红⾊结点,因为⾮空树插⼊,新增⿊⾊结点就破坏了规则4,规则4是很难维护的。
3. ⾮空树插⼊后,新增结点必须红⾊结点,如果⽗亲结点是⿊⾊的,则没有违反任何规则,插⼊结束。
4. ⾮空树插⼊后,新增结点必须红⾊结点,如果⽗亲结点是红⾊的,则违反规则3。进⼀步分析,c是红⾊,p为红,g必为⿊,这三个颜⾊都固定了,关键的变化看u的情况,需要根据u分为以下⼏种情况分别处理。 

2.2.1.1 u(uncle)不存在 ,c为p的左孩子(单旋+变色)

 2.2.1.2 uncle存在且为黑,c为p的左孩子(单旋+变色)

2.2.1.3  u(uncle)不存在 ,c为p的右孩子(双旋+变色)

 2.2.1.4 uncle存在且为黑,c为p的右孩子(双旋+变色)

 

2.3插入节点的代码实现

 

 

3. 本期关于红黑树的总结:

  我觉得有一些难度,特别是在选旋转这里,要不是我为了写博客,在上完课之后,又梳理了一边。整体将清楚的结构写了下来,希望对大家有真的帮助。 


http://www.ppmy.cn/news/1563465.html

相关文章

Django自带admin管理系统使用

1、admin路径地址 localhost:8000/admin 2、使用命令行创建超级管理员 python manage.py createsuperuser 之后按照提示一步一步往下走就好了。 3、修改管理员密码 python manage.py changepassword admin admin是超级管理员的账号 4、后台管理系统注册模型&#xff0c;…

面试: 工作中常用的linux命令

cd 切换工作目录 vim Linux中最常用的文本编辑器 tar 打包 ,使用格式&#xff1a;tar -cvf 压缩名 文件名/目录 tail -f 动态查看文件,即监视文件的增长部分(查看日志常用) top 实时查看后台进程 top 命令主要用于监控系统…

Python编程中的两种主要的编程模式

在Python编程中&#xff0c;有两种主要的编程模式被广泛使用&#xff1a;面向过程编程&#xff08;Procedural Programming&#xff09; 和 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;。这两种模式各有优缺点&#xff0c;适用于不同的场景。 1. 面…

免费下载 | 2024安全有效性验证能力白皮书

《2024安全有效性验证能力白皮书》是一份由北京知其安科技有限公司与北京数字世界咨询有限公司联合撰写的报告&#xff0c;旨在探讨和阐述安全有效性验证&#xff08;Cybersecurity Validation&#xff0c;CV&#xff09;的概念、市场现状、关键成功因素、与传统安全评估的差异…

PanWeidb-使用BenchmarkSQL对磐维数据库进行压测

本文提供PanweiDb使用BenchmarkSQL进行性能测试的方法和测试数据报告。 BenchmarkSQL,一个JDBC基准测试工具,内嵌了TPC-C测试脚本,支持很多数据库,如PostgreSQL、Oracle和Mysql等。 TPC-C是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业…

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(一)

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(一) 你好&#xff0c;我是拉依达。 感谢所有阅读关注我的同学支持&#xff0c;目前博客累计阅读 27w&#xff0c;关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析&#xff08;持续更新&#xff09;-CSDN博客》已经是 Linu…

【大数据】机器学习-----线性模型

一、线性模型基本形式 线性模型旨在通过线性组合输入特征来预测输出。其一般形式为&#xff1a; 其中&#xff1a; x ( x 1 , x 2 , ⋯ , x d ) \mathbf{x}(x_1,x_2,\cdots,x_d) x(x1​,x2​,⋯,xd​) 是输入特征向量&#xff0c;包含 d d d 个特征。 w ( w 1 , w 2 , ⋯ ,…

2501,wtl显示html

原文 在MFC程序中有专门封装的CHTMLView来显示超文本文件,如果在对话框中显示网页可用CDHTMLDialog,甚至可实现多页超文本向导风格的对话框,但是在WTL中却没有单独封装超文本的对应控件,这是因为COM组件的使用和编写本来就是ATL的强项,WTL扩展的是ATL欠缺的桌面应用的功能部分…