转载自红黑树(C++实现)
加上了一点自己的理解,删除了一些内容
一.红黑树的概念
红黑树是一种二叉搜索树,但在每个结点上增加了一个存储位用于表示结点的颜色,这个颜色可以是红色的,也可以是黑色的,因此我们称之为红黑树。
红黑树通过红黑颜色的限制,确保没有一条路径会比其他路径长出两倍,因此红黑树是近似平衡的。
1.红黑树的性质
红黑树有以下五点性质:
每个结点不是红色就是黑色。
根结点是黑色的。
如果一个结点是红色的,则它的两个孩子结点是黑色的。
对于每个结点,从该结点到其所有后代叶子结点的简单路径上,均包含相同数目的黑色结点。
每个叶子结点都是黑色的(此处的叶子结点指定是空结点)。
红黑树如何确保从根到叶子的最长可能路径不会超过最短可能路径的两倍?
规则决定的,如果想搜索某个节点 其最短路径是全黑的节点,有N个。最差情况则是红黑交替节点的路径,有2N个。
2.红黑树结点的定义
我们这里直接实现KV模型的红黑树,为了方便后序的旋转操作,将红黑树的结点定义为三叉链结构,除此之外还新加入了一个成员变量,用于表示结点的颜色。
数据结构:三个叉、键值对、颜色
template<class K, class V>
struct RBTreeNode
{
//三叉链
RBTreeNode<K, V>* _left;
RBTreeNode<K, V>* _right;
RBTreeNode<K, V>* _parent;
//存储的键值对
pair<K, V> _kv;
//结点的颜色
int _col; //红/黑
//构造函数
RBTreeNode(const pair<K, V>& kv)
:_left(nullptr)
, _right(nullptr)
, _parent(nullptr)
, _kv(kv)
, _col(RED)
{}
};
3.(未写完)红黑树的插入
红黑树插入结点的逻辑分为三步:
按二叉搜索树的插入方法,找到待插入位置。
将待插入结点插入到树中。
若插入结点的父结点是红色的,则需要对红黑树进行调整。
分为几种情况:
我就不仔细分析了
情况一:插入结点的叔叔存在,且叔叔的颜色是红色。
情况二:插入结点的叔叔存在,且叔叔的颜色是黑色。
情况三:插入结点的叔叔不存在。
代码。。。。未完待续。。。