一、二叉搜索树(\(BST\))
由于\(Splay\)就是一种\(BST\),所以先来说说\(BST\)是什么。
定义:
\(BST\)其实就是一棵树,不一定为满二叉树, 但必定遵循
左子树 < 根 < 右子树
。
操作
基础操作都十分简单:
- 添加元素:每次与当前所在节点比较大小,小就往左走,大就往右走,直到找到一个空位就停下来。
- 查询元素:和根比较大小,小就往左,大就往右,找到为止。
-
删除元素:先查询,找到之后总节点数-1,然后调整(把子树调整到当前位置,再按照
左子树 < 根 < 右子树
的规则调整)即可
二、\(Splay\)
开启话痨模式:
不知道\(Splay\)是啥,,你也要知道平衡树是啥。
平衡树是一个神奇的数据结构,
对于任意一个节点,左儿子的值比它小,右儿子的值比它大。
并且任意一棵子树单独拎出来也是一棵平衡树。
就像这样:
上面这个丑陋的东西就是一棵平衡树,他现在很平衡,是一棵满二叉树,高度正好是\(logn\)。
但是……
如果这个丑陋的东西极端一点,他就会变成这样:
现在看起来,这个东西一点都不平衡……
二叉树退化成了一条链
如果要查询的话,,,最坏情况下就变成了\(O(n)\)
这就很尴尬了。
于是有个大佬叫做\(Tarjan\)发明了\(Splay\)来保持平衡树平衡的外形……
\(Tarjan\)大佬的基本思路就是