【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. };


相关文章
|
8月前
|
C++
c++的学习之路:27、红黑树
c++的学习之路:27、红黑树
60 4
|
8月前
|
测试技术 C++
C++进阶--红黑树
C++进阶--红黑树
|
6天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
2月前
|
存储 C++
【C++】红黑树
红黑树是一种自平衡二叉搜索树,通过节点颜色(红或黑)及特定规则维持平衡,确保操作效率。其性质包括:每个节点非红即黑,根节点必黑,红节点的子节点必黑,从任一节点到其每个叶子的所有路径含相同数量的黑节点。实现上,通过节点结构定义、基本操作(插入、删除、旋转等)、维护平衡性质等步骤完成。代码示例展示了节点定义、插入操作及旋转调整方法。
35 2
【C++】红黑树
|
8月前
|
C++ 容器
【C++】红黑树模拟实现STL中的map与set
【C++】红黑树模拟实现STL中的map与set
|
5月前
|
关系型数据库 C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
44 0
|
6月前
|
Java C++ Python
【C++】手撕红黑树
【C++】手撕红黑树
34 1
|
8月前
|
Java C语言 C++
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现(上)
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现
62 4
|
8月前
|
C语言
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现(下)
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现
55 3
|
7月前
|
关系型数据库 C++
【c++】红黑树
【c++】红黑树
28 0