BST 死了mā?
这里为大家讲解一种全新的平衡树——前序平衡树:
1.前置知识
- fhq-treap 键值随机化思想;
- 朴素 BST。
2.定义
- 元素
x 的祖先均大于x ; - 元素
x 的左子树均小于⌊\frac{x}{2}⌋ ; - 元素
x 的右子树均大于等于⌊\frac{x}{2}⌋ ;
3.插入权值 k
在原树上暴力找到两个点
有点像链表的思路:
void insert(int x,int k,int lr)://lr存储x是左儿子还是右儿子
if x.val <= k <= father(x).val: //插入
father(k) = father(x),father(x) = k,father(x).son[lr] = k
if(x.val * 2 <= k) k.son[0] = x;
else k.son[1] = x;
//将<k/2的存在左,否则存右
if(k * 2 <= x.val) insert(ls(x),k,0);
else insert(rs(x),k,1);
4.删除权值 k
同样在原树上暴力找到点
- 主播主播,那删掉之后
x 有两个儿子怎么办? - 我们定义一个 merge 操作:
void merge(int l,int r): if(siz(r)==0)ls(r)=l; merge(l,ls(r));由于我们这棵树的性质,所以一定可以把左子树一直递归放到右子树。
求排名,求第
性质一:离散化后的树和非离散化的树结构不同。
因为离散化后原本大于
此时我们的树就变成了一棵趋近平衡的树,理论复杂度
代码先咕着。