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

devtools/2025/1/16 3:45:26/

目录

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/devtools/150831.html

相关文章

C#读写ini配置文件保存设置参数

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b5P5rkA&ftt&id22173428704 [DllImport("kernel32", CharSet CharSet.Unicode)] public static extern uint GetPrivateProfileString(string lpAppName, stri…

服务器出现蓝屏现象的原因有什么?

当服务器定期出现蓝屏的现象&#xff0c;则会影响到企业业务的连续性&#xff0c;同时还可能会导致重要数据信息丢失和系统稳定性下降&#xff0c;是一种较为复杂的技术问题&#xff0c;本文就来探讨一下导致服务器出现蓝屏的原因都有什么。 服务器出现蓝屏有可能是硬件出现了故…

在Ubuntu下安装PostgreSQL数据库以及安装pgAdmin4工具

文章目录 1. 环境安装2. 基础操作3. 配置数据库4. 安装pgAdmin45. 注意 1. 环境安装 PostgreSQL是一个功能强大的开源对象-关系型数据库系统 QT安装数据库 sudo apt-get update sudo apt-get install libqt5sql5-psql2. 基础操作 sudo su - postgres //进入数据库 psql //数…

深入理解多线程 线程的start方法 底层原理 为何Java=(C++)--

目录 Java 并发包 祖师爷 四大口诀 为什么多线程及其重要 硬件&#xff1a;摩尔定律失效 软件&#xff1a;系统需求 Start 方法 C 源码解读 底层逻辑 操作系统分配 Java 并发包 Java Util Concurrent 祖师爷 四大口诀 为什么多线程及其重要 硬件&#xff1a;摩尔定律…

java fastjson2将 map、实体类、list等 类型转换为JSON介绍

Fastjson2 提供了强大的类型转换功能&#xff0c;可以方便地将 JSON 字符串解析为 Java 对象、集合类型&#xff0c;或者其他自定义类型。这些功能使得 Fastjson2 在 JSON 数据的处理上更为灵活和高效。下面详细介绍 Fastjson2 的类型转换方法和相关用法。 1. 基本的类型转换 …

如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)

如何在本地部署大模型并实现接口访问&#xff08; Llama3、Qwen、DeepSeek等&#xff09; 如何在本地部署大模型并实现接口访问&#xff08; Llama3、Qwen、DeepSeek等&#xff09;模型地址模型下载模型部署指定显卡运行app.py 运行环境requirements 调用接口代码调用 结语 如何…

C#,入门教程(27)——应用程序(Application)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application&#xff1f; 应用程序是编程的结果。一般把代码经过编译&#xff08;等&#xff09;过程&#…

Scala语言的面向对象编程

Scala语言的面向对象编程 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来组织代码&#xff0c;这些对象能够包含数据&#xff08;属性&#xff09;以及功能&#xff08;方法&#xff09;。Scala…