【重学算法】红黑树

278 阅读3分钟
  1. Red-Black Tree

红黑树,Red-Black Tree,是一种自平衡二叉查找树,被称为“对称二叉B树”。它可以在O(logn)时间内完成查找、插入和删除,这里的n是树中元素的数目。

红黑树中的节点,一类被标记为黑色,一类被标记为红色。除此之外,一棵红黑树还需要满足这样几个要求:

(1) 根节点是黑色的;

(2) 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;

(3) 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;

(4) 从任一节点到其每个叶子的所有[简单路径]都包含相同数目的黑色节点。

这些约束确保了红黑树的关键特性:最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的。

 

二叉查找树很多操作的性能都跟树的高度成正比。一棵极其平衡的二叉树(满二叉树或完全二叉树)的高度大约是 log2n,所以如果要证明红黑树是近似平衡的,我们只需要分析,红黑树的高度是否比较稳定地趋近 log2n 就好了。

如果我们将红色节点从红黑树中去掉,仅包含黑色节点的四叉树的高度,比包含相同节点个数的完全二叉树的高度还要小。完全二叉树的高度近似 log2n,这里的四叉“黑树”的高度要低于完全二叉树,所以去掉红色节点的“黑树”的高度也不会超过 log2n:

 

因为每一个红黑树也是一个特化的二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。然而,在红黑树上进行插入操作和删除操作会导致不再符合红黑树的性质,恢复红黑树的性质需要少量O(logn)的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。红黑树的插入与删除操作时间仍可以保持为O(logn)次。

 

  1. 红黑树 vs AVL树 vs 跳表

AVL 树是一种高度平衡的二叉树,所以查找的效率非常高,但是,有利就有弊,AVL 树为了维持这种高度的平衡,就要付出更多的代价。每次插入、删除都要做调整,就比较复杂、耗时。所以,对于有频繁的插入、删除操作的数据集合,使用 AVL 树的代价就有点高了。红黑树只是做到了近似平衡,并不是严格的平衡,所以在维护平衡的成本上,要比 AVL 树要低。

因为红黑树是一种性能非常稳定的二叉查找树,所以,在工程中,但凡是用到动态插入、删除、查找数据的场景,都可以用到它。不过,它实现起来比较复杂,如果自己写代码实现,难度会有些高,这个时候,其实更倾向用跳表来替代它。

 

  1. 红黑树的插入与删除