红黑树实现(附C++源码)

devtools/2024/10/21 19:56:20/

游凡/红黑树icon-default.png?t=O83Ahttps://gitee.com/you-fan-a/red-black-tree

一、什么是红黑树

遵循 一定规则,每个节点都有颜色且都是红色黑色的搜索二叉树就是红黑树。

红黑树的平衡性查找效率不如AVL树,但是插入和删除比AVL树要强。

二、红黑树的规则

1、红黑树是二叉搜索树

2、每个节点要么红色要么黑色

3、红色节点的儿子都是黑的。

4、二叉树的每个路径(空节点也在路径中)上的黑色节点总个数相同。

统计路径时别忘记空节点

三、红黑树插入调整部分

3.1红黑树的插入

插入的基础规则就是搜素二叉树的插入规则。

*插入的节点只为红色,如果是头节点,将它变黑

*如果插入的节点破坏了红黑树的规则(父亲为红色),则对该树做出对应情况的调整。

3.2插入调整 

(调整涉及到旋转,关于旋转可看另一篇文章AVL树速览(附带源码)-CSDN博客)

调整是一个循环的过程,当调整的节点的父亲为黑时,说明该节点无需调整,循环结束。

所有调整结束后,头节点无论是什么颜色,都要变黑。

新节点插入后,树中可能出现以下情况(图中的一些节点用c,p,g,u字母标识)

(1)插入(某个)节点,该节点的父亲和父亲的兄弟都为红,祖父(父亲的父亲)为黑

c,p,u为,g为

调整方法1:p,u变黑,g变红。然后让c=g,向上循环调整

右边这种情况也是一样

(2) 某个节点,该节点的父亲为红父亲的兄弟不存在或为祖父(父亲的父亲)为黑

c,p为,g,u为

(*注:u存在且为黑时,c不可能新插入节点。若c是新插入节点,则在插入之前这棵树就会破坏规则,不是红黑树了。所以a,b,c子树中一定有黑色节点保证这棵树遵守规则)

调整方法2:g进行右单旋,旋转后p变,g变。然后让c=p,向上循环调整。

右边也是一样

(3)某个节点,该节点的父亲为红父亲的兄弟不存在或为祖父(父亲的父亲)为黑

c,p为,g,u为

(与2不同的是c的位置

解决方法3:先对p进行左单旋,再对g进行右单旋。c变黑,g变红。然后向上循环调整

右边也是一样

四、红黑树的验证

验证的点:
1、验证根节点是否是黑色或为空。

2、验证是否有连续的红色节点(验证节点和他的父亲)

3、先获取最左路径的黑色节点数目作为基准值,然后通过递归验证每个路径的黑色节点是否与基准值相等。

(具体代码在开头的链接里)


http://www.ppmy.cn/devtools/127642.html

相关文章

[JAVAEE] 线程安全的案例(一)-单例模式

目录 一. 单例模式 二. 单例模式的使用时机 三. 单例模式的关键代码 四. 单例模式的几种实现方式 4.1 饿汉方式(急) 4.2 懒汉模式(缓) a. 解决原子性的问题 b. 解决程序运行效率低下的问题 c. 解决指令重排序的问题(其次是为了解决内存可见性的问题) 五. 总结 一. …

.net framework 3.5sp1安装错误卡住不动怎么解决

解决 .NET Framework 3.5 SP1 安装错误卡住的问题,可以尝试以下几种方法: 1.使用 DISM 工具: 将下载的 NetFx3.cab 文件放置在 C:\Windows 文件夹下。 以管理员身份打开命令提示符,输入以下命令: dism /online /En…

Python知识点:基于Python工具,如何使用Brownie进行智能合约测试

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用Brownie进行智能合约测试 在以太坊智能合约开发中,测试是至…

java01作业说明:

1. 功能概述 该BMI计算器应用程序的主要功能是: 输入身高和体重:用户可以输入其身高(以米为单位)和体重(以千克为单位)。计算BMI:根据用户输入的身高和体重计算BMI值。健康反馈:根…

Element Ui el-table列表中的tooltip内容过长超出屏幕换行显示

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示内容,虽然el-table列属性中带的有show-overflow-tooltip,可以设置内容超出列宽度显示为…,且有tooltip提示全部内容,但是内容过多时,提示会超出屏幕: 只有…

Android Studio 编译报错整理

Android Studio 编译报错整理 Build Type ‘debug‘ contains custom BuildConfig fields, but the feature is disabled. buildFeatures{buildConfig true}

【rCore OS 开源操作系统】Rust 宏

前置知识点 各种宏 宏定义: 使用 macro_rules! 关键词来定义宏,这是一种模式匹配式的宏定义方式。 自 Rust 1.26 版本开始,可以使用 proc_macro 属性宏来定义过程宏(如 derive 宏)。 宏的使用: 宏可以通过…

SICK系列激光雷达单点测距仪DT80-311111+SIG200配置和通信

文章目录 一、硬件连接与SOPAS连接测距仪二、从SOPAS读取数据三、通过JSON获取数据1. 使用Postman测试接口2. 通过代码实现 一、硬件连接与SOPAS连接测距仪 首先硬件设备连接如下: 电源厂家应该是不提供,需要自行解决。 安装完成后需要使用sick的SOPAS…