【科技】 平衡树-splay

0.前言

我们都知道,二叉搜索树在随机数据下具有优良的性质,可以 \(O(\log n)\) 内实现插入、删除、按值找排名、按排名找值等操作。

但这是建立在随机数据保证的一个节点左右儿子的大小几乎相同的前提下的,如果有居心叵测的出题人构造有序或者几乎有序的序列依次插入二叉搜索树,那树高将会变为 \(O(n)\),那就寄了。

所以我们希望搞一些动作使得树高在任何情况下都能维持期望 \(O(\log n)\) 的树高。

这时便有了splay。

1.splay的基本思想

splay维护树基本平衡的方法是它的splay操作,通过旋转,将每一次要访问的结点旋转到根,splay的同时维护一下树的平衡。

2.spaly的基本操作

  • 旋转(rotate)操作

假设我们现在有这样的一个东西:

image

我想要把 \(X\) 变成 \(Y\) 的爹,但我又不能破坏二叉搜索树的性质,那么显然应当是这样的:

\(Y\) 成为 \(X\) 的左儿子,
\(A\) 成为 \(Y\) 的右儿子,
\(X\) 成为 \(R\) 的某个儿子。

另一种旋转反向与此类似。

写成代码便是:

posted @ 2022-08-17 16:19  wapmhac  阅读(30)  评论(2编辑  收藏  举报