平衡树

其实是重学Splay

Splay是一棵平衡二叉树。

      z               z
     /     右旋       /
    y     ----->    x
   / \    <-----   / \
  x   C    左旋    A   y
 / \                 / \
A   B               B   C

Splay规定,每次操作之后都会把这个点旋转到树根。

1.旋转操作

\(\tt{Splay}\)函数

有如下几种情况:

父亲和儿子是同一边

    z                 x
   /   转y       转x   \
  y   ---->  y  ---->   y
 /          / \          \
x          x   z          z
父亲和儿子不是同一边

  z          z
 /   转x    /   转x
y   ---->  x   ---->  x
 \        /          / \
  x      y          y   z

2.插入操作

最一般的,直接找到它的位置并插入即可。

若要插入一个序列到 \(y\) 后面,则先将 \(y\) 旋转到根,再将 \(y\) 的后继 \(z\) 旋转到 \(y\) 的下面,接着将序列放到 \(y\) 的左边即可。

3.删除操作

删除序列 \([L,R]\)

\(L-1\) 转到树根,再将 \(R+1\) 转到 \(L-1\) 下面,将 \(R+1\) 的左子树清空即可。

4.Splay 维护信息

1.找第 k 个数

需要维护子树大小 \(size\) ,整个区间是否要翻转的标记 \(dat\)

首先有信息上传 \(\tt{pushup}\)

然后要懒标记下传 \(\tt{pushdown}\)

先交换两个子树,再下传标记。

posted @ 2022-03-29 22:41  yzh_Error404  阅读(15)  评论(0)    收藏  举报