浅谈平衡树

平衡树是什么

二叉搜索树 BST

BST,二叉搜索树,又名二叉查找树、二叉排序树,是一种特殊的二叉树。能够保证中序遍历是有序的。

最理想的情况下,BST 的树高为 \(\mathcal O(\log n)\),但是可能会变成 \(\mathcal O(n)\)

维持树高

一棵较为理想的 BST:

014

但是可能会因为输入顺序等原因变为:

015

这样就很不好。

因此,我们可以通过各种平衡树来使树高维持在 \(\mathcal O(\log n)\)

实现方式

平衡树的实现方式有很多,平衡树更多的是一个概念上的数据结构,没有固定样式

一般来讲,能够实现普通平衡树中的四个基础操作(插入、删除、查排名、查第 \(k\) 大)的数据结构都能够称之为平衡树。

比如说 01Trie,比如说 FHQ Treap

甚至于,权值树状数组权值线段树也能够算作平衡树。

平衡树的原理

平衡树主要原理就是限制树高或者大小。

重构

替罪羊树

替罪羊树的原理就是当左右两个子树的大小差别超过一定量的时候,就将子树(不是整棵树)放入数组重构。

随机选择父节点

TreapFHQ Treap

平衡树需要抉择的无非就是树高。

那么对于两个节点,随机选择一个当作父节点,可以证明每一个节点的期望高度都是 \(\mathcal O(\log n)\)

旋转

AVL 树

AVL 树会设置一个平衡因子并维护子树高度。当左、右两棵子树的高度差大于等于平衡因子的时候就进行旋转,来保证高度差小于等于 \(1\)

旋转

旋转是一个很重要的操作。分四种类型:

  • LL 型:$T$ 的孩子的子树过长
  • 右旋节点 $T$。
  • RR 型:$T$ 的孩子的子树过长
  • 左旋节点 $T$。
  • LR 型:$T$ 的孩子的子树过长
  • 左旋节点 $L$ 成为LL型再右旋节点 $T$。
  • RL 型:$T$ 的孩子的子树过长
  • 右旋节点 $R$ 成为RR型再左旋节点 $T$。

事实上,左旋右旋很多时候是混的……因为不同人对于这俩的叫法不一样……

值得一提的是,大多数情况下,旋是将孩子转上去,旋是将孩子转下来。

然而 AVL 树存在四种情况,导致代码过长,一般不会用于 OI。

旋转至根节点

Splay 树

Splay 树通过不断将操作的节点旋转至根节点来使得均摊复杂度为 \(\mathcal O(\log n)\)

01Trie

按照二进制位来存储,插入、删除类似于字符串,求排名可以给叶子节点赋权值求和,查第 \(k\) 大同理。

权值树状数组

需要离散化。

权值线段树

需要离散化。

posted @ 2025-07-20 23:09  TH911  阅读(16)  评论(0)    收藏  举报