二叉搜索树 & 平衡树
参考资料
简介
二叉搜索树(Binary Search Tree,BST)满足左子树所有值小于根、右子树所有值大于根,中序遍历即为有序序列,支持 的插入、删除、查询,其中 为树高。但在有序数据下树高可能退化为 。平衡树 通过旋转等操作维持 ,常用于维护有序集合并支持排名、前驱后继等操作。
Treap
Treap(Tree + Heap)给每个节点附一个随机优先级,使其按键值满足二叉搜索树性质、按优先级满足堆性质。随机优先级让期望树高为 ,从而支持 的插入、删除、排名、前驱后继等操作。
竞赛中常用 无旋 Treap(FHQ Treap):只用 split(按键或按大小分裂)与 merge(合并两棵相对有序的树)两个操作即可实现全部功能,代码简短,且天然支持可持久化与区间翻转。
__gnu_pbds::tree
__gnu_pbds::tree 是基于红黑树的有序集合,配合 tree_order_statistics_node_update 可 查询元素排名与第 小,省去手写平衡树。
#include <bits/extc++.h>
using namespace __gnu_pbds;
tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag,tree_order_statistics_node_update> T;
笛卡尔树
笛卡尔树(Cartesian Tree)的节点同时满足两个性质:下标构成 BST(中序遍历即原下标序),权值构成堆。用单调栈维护右链即可 建树。
int top=0;
s[++top]=0;
for(int i=1;i<=n;i++)
{
while(top&&a[s[top]]>a[i])son[i][0]=s[top--];
if(s[top])son[s[top]][1]=i;
s[++top]=i;
}