C++中的数据结构 - 红黑树学习
C++中有一种数据结构-红黑树, 在C++的STL中有一种数据结构map,它就是基于红黑树来实现的
红黑树,是一种二叉搜索树,但是它的每个节点都有颜色,并且只有红和黑两种颜色。所以每个节点上都有一个存储位来表示节点的颜色,可以是Red和Black.
红黑树有一个很大的特点: 它能够确保没有任何一条路会比其他路径长出2倍,也就是说最多的情况呀,也就是一条路径是另一条路径的2倍,不会比2倍还多了
那么,这个是通过什么来保证的呢,这个是通过红黑树的特性来保证的,我们来看看红黑树的一些特性:
1. 每个节点不是红色就是黑色
2. 根节点是黑色
3. 每个叶子节点也是黑色的 (这里的叶子节点指的是空节点)
4. 对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
5. 如果一个节点是红色的,则它的两个孩子节点是黑色的 =》 这个就说明,红黑树中不会出现连续的红色节点
那么,这些特性,如何能够得出上面的结论 : 它能够确保没有任何一条路会比其他路径长出2倍
从特性4可以看出,我们假设在一颗红黑树中,如果从根节点到叶子节点,所有路径都应该包含相同的黑色节点个数,我们假设它包含N个黑色节点
那么这条路径最短的情况: 就是它完全由黑色节点组成,也就是说这条路径上刚好就只有N个节点,并且这N个节点都是黑色. 这种情况下,路径长度为N
那么这条路径最长的情况: 就是这条路径上既有黑色节点,又有红色节点,由2者共同组成. 根据特性5知道,红黑树中不可能存在相邻的2个红色节点(连续的红色节点),所以最多的情况也就是红黑交替,一个黑色节点,紧跟着一个红色节点。这种情况下,路径长度为2N, 其中N个是红色节点,另外N个是黑色节点
从上面可以看出,最长的路径也就是最短路径的2倍,不可能超过2倍的路径存在
现在我们来定义一个红黑树节点 C++
1. 我们用一个结构struct来定义树的节点
2. 我们用enum枚举类型来定义节点的红色和黑色
3. 我们用一个类class来定义一个红黑树
//用一个enum来定义颜色
enum Color { RED, BLACK };
//用一个结构struct来定义树的节点
template<class K>
struct RBTreeNode
{
K& key; //键
RBTreeNode<K> * leftNode;
RBTreeNode<K> * rightNode;
RBTreeNode<K> * parentNode;
Color nodeColor; //定义颜色
//构造函数
RBTreeNode(const K& _key)
: key(_key)
, leftNode(nullptr)
, rightNode(nullptr)
, parentNode(nullptr)
, nodeColor(RED) //节点初始化时为红色
{}
};
//用class来实现红黑树
template<class K>
class RBTree
{
typedef RBTreeNode<K> Node; //用typedef关键字重命名节点为Node
public:
bool Insert(const K& key); //插入
bool Find(const K& key); //查找
void InOrder(void); //中序遍历
bool IsBalance(void); //检测是否满足红黑树规则
private:
Node* root; //根节点指针
}