一、红黑树的概念
红黑树是一种二叉搜索树,但是每个结点都有表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出2倍,因而是接近平衡的二叉搜索树。
二、红黑树的特性
1、每个节点要么是黑色,要么是红色。
2、根节点是黑色。
3、每个叶子节点(NIL)是黑色。
4、每个红色结点的两个子结点一定都是黑色。
5、任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
三、红黑树的实现
1、红黑树的插入
(1)根节点为空,则直接插入节点,并将其颜色设为黑色。
(2)根节点不为空,则插入节点后,还要对其进行判断是否满足红黑树的特性,如果不满足,还需要对红黑树进行调整,让其能够满足红黑树特性。
注:一般来说,都默认插入的节点为红色
那么该如何进行调整呢?
情况一:: cur为红,p为红,g为黑,u存在且为红
其中cur为插入的节点,parent为它的父节点,uncle为它的叔叔节点,gparent为它的祖父节点。该树不一定是一棵完整的树,有可能只是一棵子树。
解决方式:将p,u改为黑,g改为红,然后把g当成cur,继续向上调整。
情况二: cur为红,p为红,g为黑,u不存在/u为黑
1、p为g的左孩子,cur为p的左孩子,则进行右单旋转。
u不存在
u存在且为黑
2、p为g的右孩子,cur为p的右孩子,则进行左单旋转。
u不存在
u存在且为黑
情况三:cur为红,p为红,g为黑,u不存在/u为黑
1、p为g的左孩子,cur为p的右孩子,则针对p做左单旋转
u不存在
u存在且为黑
2、p为g的右孩子,cur为p的左孩子,则针对p做右单旋转
u不存在
u存在且为黑
由此可以看出,对于情况三来说,都可以转换为情况二来进行处理。
左旋
右旋
代码实现:
enum Color{
RED,
BLACK
};
//红黑树节点
template<class T>
struct RBTreeNode
{
RBTreeNode(const T& data = T(), Color color = RED)
: _left(nullptr)
, _right(nullptr)
, _parent(nullptr)
, _data(data)
, _color(color)
{
}
RBT