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

游凡/红黑树https://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、先获取最左路径的黑色节点数目作为基准值,然后通过递归验证每个路径的黑色节点是否与基准值相等。

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

相关推荐
CQU_JIAKE7 小时前
10.7【A】
算法
Dfreedom.8 小时前
分类算法的统一视角:从方差最大化到概率建模再到损失函数
算法·支持向量机·分类
汉克老师8 小时前
GESP2026年9月认证C++八级( 第三部分编程题(2、末班车))精讲
c++·gesp·小学生·学c++编程
Nebula_g8 小时前
JavaSE加强:Commons-io框架
java·开发语言·算法·javase
梦帮科技9 小时前
【3.0修订版】音乐权利 NFT:MusicRightsNFT 的确权思想与授权关联
网络协议·算法·web3·区块链·密码学·智能合约·零知识证明
傲世仙尊9 小时前
C++起步-命名空间解决命名冲突与cin-cout缺省参数
开发语言·c++
Dfreedom.9 小时前
基于PCA的光谱物质识别分析
算法
(Charon)9 小时前
【C++面试】四种cast转换:static_cast、dynamic_cast、const_cast与reinterpret_cast
开发语言·c++·面试
强化湿件的技术神甫9 小时前
KS检验和Lilliefors正态性检验方法
算法
yi0119 小时前
DAY23: LeetCode 27 → 283:从移除元素到移动零,理解快慢指针的两种思路
人工智能·笔记·python·算法·leetcode·排序算法·双指针