“解密STL中的红黑树“:探究C++中STL的红黑树实现

“解密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则用于记录节点数量。

接下来,我们需要确定红黑树的五个特性:

  1. 每个节点都是红色或者黑色。
  2. 根节点是黑色的。
  3. 每个叶子节点(NIL节点,空节点ÿ

猜你喜欢

转载自blog.csdn.net/Jack_user/article/details/132294078