先写一篇Splay平衡树的博客吧(其它的还没学QAQ)。
什么是平衡树
首先需要知道二叉查找树,定义为该节点的左子树都比它的值小,右子树都比它的值大。这样有什么好处的?可以发现,中序遍历就是从小到大的顺序。
然后Splay,个人理解,通过将某个节点旋转到根节点来调整这个树的高度,尽量保持平衡。
如果树是这样的,很显然不平衡,我们需要通过操作让这棵树尽量平衡,也就是使树高尽量小。
最后旋转到类似于下面的形状。
关键操作:
1.旋转
分为左旋和右旋,要保证旋转完必须还得是一棵二叉查找树。旋转的规律在上面。
void update(int x){
tree[x].siz = tree[tree[x].ch[0]].siz + tree[tree[x].ch[1]].siz + tree[x].cnt;
//更新这个点的大小
return;
}
void rotate(int x){
int y=tree[x].fa,z=tree[y].fa; //y是x的父亲,z是y的父亲,也就是x的爷爷
int k = tree[y].ch[1]==x; //判断x是y的左儿子还是右儿子
tree[z].ch[tree[z].ch[1]==y] = x; //z的儿子给标记成x
tree[x].fa = z; //x的父亲是z
tree[y].ch[k]