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])$

posted @ 2022-03-31 17:09  枉玊  阅读(148)  评论(0)    收藏  举报