版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
title: 模板 - 红黑树 categories:
红黑树是一种平衡树, 是 C++ std::(multi)?(set|map)
, Java Tree(Set|Map)
的底层实现
代码参考了 pb_ds
的设计方式, 时空均略优于 pb_ds
{% note info %} 这里的代码实际上是 order-statistic tree, 即每个结点都记录了对应子树的大小, 因此支持查找排名以及根据排名反查数据 {% endnote %}
{% note warning %} 仅在 GCC 下测试过 {% endnote %}
{% note warning %} https://cplib.tifa-233.com/src/code/ds/rbtree.hpp 存放了笔者对该算法/数据结构的最新实现, 建议前往此处查看相关代码 {% endnote %}
<!-- more -->参考了 pb_ds
的设计方式, 使用了 Mixin Classes, balance_tree<K, bst_tag>
即为二叉搜索树, balance_tree<K, rbt_tag>
即为红黑树
具体来说, 代码中把一般的平衡树/顺序统计树操作 (遍历, (lower|upper)_bound
, order_of_key
, find_by_order
等) 和红黑树的操作 (旋转, 插入和删除的性质维护等) 解耦. 又由于红黑树的插入/删除可以视为先按二叉搜索树的方式插入/删除, 再进行平衡维护操作, 故代码中也将这两部分解耦, 并让 rbt_tag
继承 bst_tag
来提高代码复用率
使用方式类似 pb_ds
的 __gnu_pbds::tree
, 只是没有将维护子树大小的部分解耦出来
洛谷 P6136 【模板】普通平衡树(数据加强版)
<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb cpa_cpp title:Luogu_P6136 Luogu/P6136/3.cpp %} </details>