Splay树
Splay树是一种BST树,允许查找、插入、删除、分割、合并等操作。
Splay树的原理:
为了使整个查找时间更少,被查频率高的那些结点应当经常处于靠近树根的位置。Splay树可以通过旋转的方式把被访问结点旋转到树根的位置以减少查找时间。
与Treap树的不同:
- Splay树允许把任意结点旋转到树根,Treap树形态固定所以不能。
- Splay树分裂、合并更简便。
Splay树的操作
提根(把结点x旋转到根)
x的父结点是根,只需旋转一次。x是左儿子则右旋,反之左旋,且前后中序顺序不变。
x的父结点不是根,但x、x的父结点、x的父结点的父结点三点共线,则先旋转x的父结点,再旋转x。
x、x的父结点、x的父结点的父结点三点不共线,把x按不同方向旋转两次。
插入:
同BST树的插入
删除:
待删结点旋转到根,删除,合并左右子树。
合并:
只有left树的所有元素都小于right树的所有元素从可以合并。先把left最大元素x旋转到树根,再把x的右子树接到right上。
分裂:
把第k小的元素旋转到树根,然后把它与右子树断开即可。
查找x:
把x旋转到根结点
查找最大、最小、第k大的数。用中序遍历查找,查找后把它旋转到根。