1. t r e a p treap treap 的性质
t r e a p = t r e e + h e a p ? treap=tree+heap? treap=tree+heap?
t r e a p treap treap 是一种思路简单,码量较小的(弱)平衡树。
对于每个要维护的值 a a a ,我们再取一个值 b b b ,让 a a a 满足 二叉搜索树 的性质 , b b b 满足 堆 的性质 ,易知这是一棵 笛卡尔树 ,我们让 b b b 取随机数,那么它的形态近乎平衡。
性质嘛,就是二叉搜索树的所有性质它都满足,它只不过是让二叉树的形态平衡一点而已。
2.旋转 t r e a p treap treap
基本操作:旋转
在二叉搜索树插入与删除的过程中,经常会改变树的形态,我们就需要一种操作来维护 t r e a p treap treap 的性质,在旋转 t r e a p treap treap 中,这种操作就是左旋和右旋。
以左旋为例,我们在某一操作结束后发现根节点的右儿子 B B B 的 b b b 比根节点 A A A 的 b b b 小,那么为了维护堆性质我们要把右儿子变成根节点,但这样会破坏二叉搜索树性质,所以我们要把 B B B 的左儿子接到 A A A 的右儿子上,如下图。
右旋就同理了。
void pushup(int x) {s[x]=s[l[x]]+s[r[x]]+w[x];}
void lrotate(int &k) {
int t=r[k];
r[k]=l[t],l[t]=k,s[t]=s[k],pushup(k),k=t;
}
void rrotate(int &k) {
int t=l[k];
l[k]=r[t],r[t]=k,s[t]=s[k],pushup(k),k=t;
}
其他操作
t r e a p treap treap 可以实现 插入、删除、排名数值互查、前驱后继互查 ,具体代码与二叉搜索树差不多,可以去 operator_的模板综合(动态更新) 里查看。
3.非旋 t r e a p treap treap
等待更新