Immersive Datastructures
前言
这篇文章中主要整理一些不常用(于 OI 中)但是经典的数据结构。因此,文章中不专门给出代码实现(可能会给出一些伪代码),仅是阐述理论。
I 红黑树
是二叉搜索树的一种,区别于普通的二叉搜索树,红黑树与 Splay 树、AVL 树等都是平衡二叉搜索树,这保证了搜索树的高度不会太高,使得操作的时间复杂度在最坏情况下为 \(O(\log n)\)。
红黑树在每个节点上增加了一个变量用来存储树上每个节点的颜色,可以是黑色(BLACK)或红色(RED)。在运行过程中,红黑树通过维护树上各个节点之间的红黑关系来对树的高度进行平衡。但是,红黑树不像 AVL 树那样有很严格的平衡要求,因此我们称红黑树为弱平衡二叉搜索树。尽管这样会使红黑树的树高在同等节点数量的情况下普遍高于 AVL 树,但由于其平衡过程中对树结构的旋转次数较少(即我们所称的“常数较小”),AVL 树和红黑树的平均时间复杂度在现实应用中几乎相同。
对于一颗红黑树,其节点中一般储存这这些信息:
struct RB-Tree{
color; //节点颜色
left; //左儿子编号
right; //右儿子编号
father; //父节点编号
key; //存储的值
}
如果一个节点没有对应的左右儿子,那么对应的 left right 值指向一个固定的值 NIL。可以发现,红黑树中带有信息的都是树种的内部节点,叶子节点不存储信息。
一般的,一棵合法的红黑树应满足如下五条性质:
- 每个节点只能是红色或黑色。
- 根节点必须是黑色。
- 每个叶子节点(
NIL)也是黑色。 - 如果一个节点是红色的,那么它的两个儿子节点(如果存在的话)必须都是黑色的。
- 对于每个节点,从该节点到其所有叶子的简单路径上经过的黑色节点数目均相同。
一般定义:从某个节点出发(不含该节点自己)到达任何一个叶子节点的任意一条简单路径上的黑色节点个数称为这个节点的黑高。特殊地,把根节点的黑高定义为整棵红黑树的黑高。

浙公网安备 33010602011771号