【C++】-- 红黑树详解(一)

简介: 【C++】-- 红黑树详解

一、红黑树概念

1.概念

红黑树也是一种二叉搜索树,在每个结点上增加一个存储位,来表示该节点的颜色,节点要么是红色要么是黑色。

2.性质

红黑树具有以下性质:

(1)每个结点不是红色就是黑色

(2)根节点是黑色的

(3)没有连续的红色节点

(4)每条路径上都包含相同数目的黑色节点

由于(3)和(4)互相控制,因此满足以上性质就能保证:最长路径中节点个数不会超过最短路径节点个数的2倍

最短路径:全部由黑色节点构成

最长路径:由一黑一红构成,且红色节点数量等于黑色节点数量。

假设黑色节点有N个,最短路径长度为最长路径长度为2*。但是在红黑树中,不一定有最短路径和最长路径。

二、红黑树定义

1.红黑树节点定义

红黑树节点相比于AVL树,多了一个颜色,因此需要一个成员变量来存储节点颜色。AVL树用高度严格控制平衡。红黑树近似平衡,所以不需要平衡因子。

但是红黑树节点的构造函数在初始化节点时,肯定要初始化节点颜色的,那么颜色需要一开始初始化成红色,因为初始化成红色,可能破坏规则(3),影响不大。但是假如将节点初始化成黑色,一定会破坏规则(4)。

(1)将新插入节点置为红色

假如将新插入节点置为红色,会有以下两种情况:

①当父亲是黑色时,没有破坏规则(3),也没有破坏规则(4)

②当父亲是红色时,破坏了规则(3),但是只需要改变一下颜色即可

(2)将新插入节点置为黑色

但是假如将新节点初始化成黑色,不管父亲是黑色还是红色,一定会破坏规则(4),并且影响其他路径,影响范围广。

①当父亲是黑色时,破坏了规则(4)

②当父亲是红色时,也破坏了规则(4)

 

 

因此节点要初始化成红色。

1. //红黑树节点颜色
2. enum Colour
3. {
4.  RED,
5.  BLACK,
6. };
7. 
8. //红黑树节点定义
9. template<class K,class V>
10. struct RBTreeNode
11. {
12.   RBTreeNode<K, V>* _left;//节点的左孩子
13.   RBTreeNode<K, V>* _right;//节点的右孩子
14.   RBTreeNode<K, V>* _parent;//节点的父亲
15. 
16.   pair<K,V> _kv;//节点的值
17.   Colour _col;//节点颜色
18. 
19.   RBTreeNode(const pair<K, V>& kv)
20.     :_left(nullptr)
21.     ,_right(nullptr)
22.     ,_parent(nullptr)
23.     ,_kv(kv)
24.     ,_col(RED)//节点初始化成红色
25.   {}
26. };

2.红黑树定义

1. template<class K,class V>
2. class RBTree
3. {
4.  typedef RBTreeNode<K, V> Node;
5. 
6. //构造函数
7. RBTree()
8.    :_root(nullptr)
9.  {}
10. 
11. private:
12.   Node* _root;
13. };


相关文章
|
3月前
|
C++
c++的学习之路:27、红黑树
c++的学习之路:27、红黑树
39 4
|
3月前
|
测试技术 C++
C++进阶--红黑树
C++进阶--红黑树
|
3月前
|
编译器 C++ 容器
【C++学习手札】基于红黑树封装模拟实现map和set
【C++学习手札】基于红黑树封装模拟实现map和set
|
3月前
|
存储 关系型数据库 数据库
【数据结构】—红黑树(C++实现)
【数据结构】—红黑树(C++实现)
|
3月前
|
C++ 容器
【C++】红黑树模拟实现STL中的map与set
【C++】红黑树模拟实现STL中的map与set
|
8天前
|
关系型数据库 C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
15 0
|
1月前
|
Java C++ Python
【C++】手撕红黑树
【C++】手撕红黑树
14 1
|
2月前
|
关系型数据库 C++
【c++】红黑树
【c++】红黑树
12 0
|
3月前
|
Java C语言 C++
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现(上)
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现
32 4
|
3月前
|
C语言
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现(下)
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现
34 3