目录
前言:
在C++中,红黑树是二叉搜索树的另一种优化版本,他与AVL树的区别在于保持树的平衡方式不同,AVL树保持平衡的方式是在节点中多存储一个成员来记录平衡因子,红黑树保持平衡的方式也是增加了一个成员,但是该成员的作用是记录节点的两种状态(颜色):红色--黑色。当然只记录颜色并不能保持平衡,红黑树还规定最长路径的节点个数不会超过最短路径的节点个数的两倍,因此红黑树不会因为插入有序数据而演变成“单支树”。
1、红黑树的规则
红黑树有如下规则:
1、顾名思义,红黑树的节点只能有黑色和红色两种状态。
2、根结点默认为黑色。
3、红色节点的两个孩子只能是黑色节点。
4、插入的节点默认为红色节点。
5、每条路径的黑色节点都相同。
红黑树正确示意图:

红黑树错误示意图:

2、红黑树节点的定义
通过上述对红黑树的简述,可以给出红黑树的节点代码:
#define _CRT_SECURE_NO_WARNINGS 1
enum Colour//定义一个枚举
{
RED,
BLACK,
};
template<class K, class V>
struct RBTreeNode
{
RBTreeNode<K, V>* _left;//指向左孩子
RBTreeNode<K, V>* _right;//指向右孩子
RBTreeNode<K, V>* _parent;//指向父母节点
pair<K, V> _kv;//记录数据
Colour _col;//若是AVL树这里记载的是平衡因子,红黑树是颜色
RBTreeNode(const pair<K, V>& kv)
:_left(nullptr)
, _right(nullptr)
, _parent(nullptr)
, _kv(kv)
, _col(RED)//默认插入的节点是红色
{}
};
可以发现,红黑树的节点代码几乎和AVL树一模一样,只是控制平衡的条件有区别,仅此而已。
3、红黑树插入节点的调整操作
红黑树的插入函数可以分两个步骤:
1、找到合适的位置插入,即二叉搜索树插入的逻辑(小于根节点的放在左边,大于根节点的放在右边)。
2、因为插入的节点默认为红色,则插入节点后,查看当前树是否破坏了红黑树的规则,即观察其节点的父母节点是否为红色,如果是则需要进行调整操作(规则3)。
在分析之前,先确定好节点之间的关系名称(cur表示新插入的节点,parant表示父母

最低0.47元/天 解锁文章
1749

被折叠的 条评论
为什么被折叠?



