红黑树的定义(上篇)

文章目录

    • 什么是红黑树
    • 什么是一颗红黑树的黑高(Black Height)?
    • 总结
    • 红黑树的应用场景

什么是红黑树

红黑树(Red Black Tree)是一颗自平衡(self-balancing)的二叉排序树(BST),树上的每个节点都满足以下规则:

  1. 每个节点都有一种颜色,不是红色就是黑色;
  2. 树的根节点是黑色;
  3. 树中不存在两个相邻的红色节点(红色节点的父节点和孩子节点中都不能含有红色节点);
  4. 从任意节点出发到其任何后代节点的每条路径中包含的黑色节点的数量相同。

注意:为了更好的进行插入和删除操作,我们将所以的叶子节点的左右孩子节点设置为黑色的null节点,即逻辑空节点,但是在代码遍历的时候可以访问到。

红黑树的定义(上篇)_第1张图片
比如上图所示:根节点6到达任意叶子节点,路径中所有的黑色节点数量都是3(如:6 -> 2 -> null,6 -> 15 -> 10 -> 9 -> null)。15节点是红色的那么它的父节点,孩子节点必须是黑色的,而不能是红色的,所以叶子节点的左右孩子都是空的黑色节点。

什么是一颗红黑树的黑高(Black Height)?

在一颗红黑树中,从某个结点 x 出发(不包含该结点)到达一个叶结点的任意一条简单路径上包含的黑色结点的数目称为 黑高 ,记为 bh(x) .。比如上图所示:黑高就是2;
红黑树的黑高则为其根结点的黑高。根据红黑树的性质 3、4,一颗红黑树的黑高 bh >= h/2
从一个结点到其最远的后代叶结点的顶点数目不会超过从该结点到其最近的叶结点的结点数目的两倍。
这句话的意思就是公式 bh >= h/2,其中黑高 bh 就表示从根结点 6 到离它最近的叶结点 2 包含的结点数 2 ,而 h 则表示从根结点 6 到其最远的叶结点 9 所包含的结点数目 4 ,显然这一公式是合理的。

总结

  1. 满足了以上4个性质的红黑树Tree(n)的话,可以知道从根节点到任何叶子节点的长度,最大值max,最小值min之间的关系是max <= 2 * min。因为最坏的情况在一条路径上红黑节点相间链接,最好的情况是在一条路径上全部都是黑色节点。
  2. 这样的情况下可以保持这颗自平衡的红黑树大致平衡,虽然和二叉平衡树的相比做不到绝对平衡,但是效率更高,因为插入和删除节点之后为了达到平衡需要做平衡操作,二叉搜索平衡树为了达到平衡需要做很多旋转操作,修改二叉树的效率反而降低了,效率仅仅是查询的时候达到了log(n)的效率。红黑树在满足以上4个性质的情况下,插入和删除节点的时候,只需要花费最多log(n)的时间复杂度,最少只需要一次就可以平衡。红黑树即满足了查询log(n)的复杂度又满足了修改(最大log(n),最小1)的复杂度,总体上比二叉搜索平衡树更具有性能优势。

下一篇,我将讲解红黑树插入操作,点我。

红黑树的应用场景

大多数自平衡BST(self-balancing BST) 库函数都是用红黑树实现的,比如C++中的map 和 set (或者 Java 中的 TreeSet 和 TreeMap)。

红黑树也用于实现 Linux 操作系统的 CPU 调度。完全公平调度(Completely Fair Scheduler)使用的就是红黑树。

下图来自于为英文的维基百科(该图为Linux的内核图)。
红黑树的定义(上篇)_第2张图片

你可能感兴趣的:(算法,leetcode,红黑树)