Splay
Splay
-
二叉查找树($BST$)
能够在这棵树上查找某个值的性质:左子树任意结点$<$根节点的性质$<$右子树的性质
维护二叉查找树,通过不断的将某个节点旋转到根节点,使得整棵树依然满足而二叉查找树的性质,并且保持平衡而不至于退化成链。
所有的操作必须保证中序遍历不变
操作
旋转:(改变父子之间的关系即父变子,子变父,且其余结点中序遍历不变)
左旋
右旋 (维护的是中序遍历不变)
右旋
->
z z
/ //
y x
/ \ / \
x c A y
/ \ //
A B B C
AxByc AxByc <-
左旋
splay(x, k): 将点x旋转至点k下面
双旋,分类来看
z y x / / \ \ y x z y / \ x z 先转y 转x 每转一次x往上走两格 直到某个点下面为止z z x / / / \ y x y z \ / x y 先转x 转x 每转一次x往上走两格 直到某个点下面 插入
1 找到x插入的位置
把x转到根
2 将一个序列插到y的后面
x y z
找到y的后继 z
将y转到根 splay(y, 0)
将z转到y的下面 splay(z, y)
y
z
/
null(因为z和y之间没有数,所以z左子树为空)直接将序列插入z的左子树即可
删除s
例如要删除$l,r$则要找到$l-1, r + 1$
将$l-1$转到根节点
将$r + 1$转到$l-1$下面
则此时$r+1$的左子树就是$[l,r]$
将$r+1$的左子树滞空$(删除[l,r])$

浙公网安备 33010602011771号