“解密STL中的红黑树”:探究C++中STL的红黑树实现
红黑树是一种自平衡的二叉查找树,相比于普通的二叉查找树,它能够维护平衡,因此查询、插入等基本操作在最坏情况下仍然能够保证O(logN)的时间复杂度。STL中就使用了红黑树来实现许多关键数据结构,比如map和set。那么,究竟如何实现红黑树呢?
STL在header文件<stl_tree.h>中定义了节点结构体_Rb_tree_node_base和_Rb_tree_node,其中_Rb_tree_node_base封装了一个指向父节点、左节点和右节点的指针,_Rb_tree_node则继承自_Rb_tree_node_base并封装了一个value,代表存储的数据。红黑树除了常规的节点结构之外,还需要记录两个关键信息:根节点root和节点数量node_count。这些信息被封装在另一个结构体_Rb_tree_impl中。
struct _Rb_tree_impl {
typedef _Rb_tree_node_base* _Base_ptr;
_Base_ptr _M_header; // 头节点,不存储值
_Base_ptr _M_node_count; // 节点数量
};
我们可以看到,_Rb_tree_impl提供了两个指针,_M_header指向红黑树的伪根节点(header),此节点不实际存储数据,仅用作辅助节点。_M_node_count则用于记录节点数量。
接下来,我们需要确定红黑树的五个特性:
- 每个节点都是红色或者黑色。
- 根节点是黑色的。
- 每个叶子节点(NIL节点,空节点ÿ