平衡树的性质
它其实就是一个 BST(Binary Search Tree 二叉搜索树)。
当然,不同的平衡树会有自己的特性
BST 的性质
只有一个:任意一个节点的左子树的所有节点都比它的优先级高,右子树的所有节点都比他的优先级低。
注意:一个节点也可以当成一颗子树
如下:
![](https://img-blog.csdnimg.cn/img_convert/2c9b797a37275eb5978b5c44fe350b0d.png)
Why 平衡树?
看到这里你也许会想:既然平衡树就是一颗 BST ,那还要它干嘛?
看这里:
![](https://img-blog.csdnimg.cn/img_convert/aa9d4ba84e57d3952639c4703eec8309.png)
由于 BST 可能会退化成一条链,使得原本 \(O(log n)\) 的速度退化成 \(O(n)\)
于是,大佬们发明了各种各样的平衡树,避免 BST 退化成一条链
平衡树的分类
\[\text{平衡树} \left\{ \begin{array}{**lr**} \text{旋转平衡树} \left\{ \begin{array}{**lr**} \text{Splay} & \\ \text{Treap} \end{array} \right. & \\ \text{非旋平衡树} \left\{ \begin{array}{**lr**} \text{FHQ Treap} & \\ \text{替罪羊树} \end{array} \right. \end{array} \right. \]
当然这里只是最常用的
还有更多的平衡树等待着你去学习、发明
平衡树的效率
操作 | 时间复杂度 |
---|---|
插入元素 | \(O(log n)\) |
弹出元素 | \(O(log n)\) |
查询排名 | \(O(log n)\) |
查询第 K 大 | \(O(log n)\) |
查询前驱 | \(O(log n)\) |
查询后继 | \(O(log n)\) |
当然这些是基础功能,还有更多的以后会学到
平衡树的解析
FHQ Treap
这是一个最适合新手学习的
包含区间反转、可持久化FHQ Treap
Splay
这个也是必须要掌握的
包含区间反转、 LCTSplay
The End