红黑树原理简析

来源:互联网 发布:数据库集群方案 编辑:程序博客网 时间:2024/06/11 19:34

序言


红黑树是一种应用十分广泛的平衡二叉搜索树。大部分语言和库中TreeMap的实现都是使用红黑树,还有Linux、Nginx等也使用了红黑树。
但是红黑树也是一种非常复杂的数据结构,为了保持平衡,在修改的时候必须进行维护操作,插入操作要分5种不同的情况来处理,而删除则有6种情况。
实际上,没有必要沉迷于这十几种情况不能自拔。多数时候,了解红黑树的原理和由来就足够了。因为实际应用中,几乎不可能有需要自己编写红黑树代码的应用场景,哪怕是Linux内核、GCC这种级别的应用也没有选择自己造轮子,而是照抄《算法导论》上的红黑树代码。

2-3-4树


讲红黑树之前,我们需要了解一下2-3-4树,它是红黑树的理论基础。

我们知道,普通二叉查找树之所以会出现查找效率退化的情况,是因为不平衡,极端的一种情况是每个内部节点只有一个子节点,如下图。这时候二叉查找树已经变成了链表。
链表

而另一个极端则是,所有内部节点都有两个非空子节点,所有叶节点的深度都相等,被称为“满二叉查找树”,这个时候查询效率是最高的。
满二叉查找树

2-3-4树就是满二叉查找树的泛化,满二叉查找树是2-3-4树的特殊情况:

  • 2-3-4树中每个内部节点可以包含1个、2个或3个的元素,他们一定有2、3或4个子节点,而满二叉查找树每个内部节点仅含1个元素,有且只有两个子节点
  • 2-3-4树中每一个元素都大于或等于它左子树中的任意元素,这是查找树的基本特性
  • 2-3-4树中所有叶节点的深度都相等,这一点跟满二叉查找树一样

这里写图片描述

由于插入、删除实现起来太过复杂,2-3-4树在实际应用中极为少用,但是红黑树却来源于2-3-4树,它使用标上颜色的二叉查找树来模拟2-3-4树。因此每一棵红黑树都有与之相应的2-3-4树,他们是等价的。

红黑树


如果我们把2-3-4树稍微转换一下,他就成了红黑树。

对于2-3-4树中每一个节点,进行下面三种变换:

  1. 如果它只有一个元素,则不用修改它,直接让它作为黑色节点。
    这里写图片描述

  2. 如果它有两个元素,三个子节点(分别为左、中、右子节点),那么保留小的元素,这个节点成为黑色节点,大的元素成为一个新的红色节点作为这个黑色节点的右子节点,而新的红色节点的两个子节点为原节点的中、右节点。
    这里写图片描述

  3. 如果它有三个元素,四个子节点(1,2,3,4子节点),那么保留第二大的元素,这个节点成为黑色节点,而最小的元素和最大的元素成为两个新的红色节点,作为黑色节点的左、右子节点。原节点中的1,2子节点成为左红色节点的子节点,3,4子节点成为右红色节点的子节点。
    这里写图片描述

上面的变换,把2-3-4树的单个节点变成一棵小的红黑树,这棵小红黑树以黑色节点为根节点,且只包含这一个黑色节点。
对2-3-4树的所有节点进行这种变换,就得到了这棵2-3-4树对应的红黑树。

根据2-3-4树的性质,我们可以得到红黑树的一些性质:

  1. 根节点是黑色的
  2. 红色节点的子节点一定是黑色的,也就是一条路径上不存在连续两个或以上的红色节点
  3. 从根节点出发,到任意叶节点的路径上,黑色节点的数量都是相同的
  4. 最深的叶节点深度不超过最浅的两倍

解释一下第四条性质。
因为从根节点到叶节点任意路径上黑色节点的数量是相同的,所以最长路径只会比最短路径多出一些红色节点。又因为不存在连续的红色节点,所以极端情况下最长路径只能是红黑相间的形式,同时最短路径则只包含黑色节点。在这种情况下最长路径的红色节点跟黑色节点的数量相同,而最短路径只有黑色节点,所以最长路径长度会是最短的两倍。当然这是最极端的情况,绝大多数情况下是小于这个差距的。

正是这一条性质约束,使得红黑树成为平衡的二叉查找树

对比


普通二叉查找树

跟完全没有约束的普通二叉查找树相比,红黑树要保证约束始终成立,在插入和删除的时候就必须进行额外的维护操作。这也是红黑树比普通二叉查找树复杂得多的原因。

满二叉查找树

满二叉查找树,它的每一条根节点到叶节点的路径长度都是相等的,所以查询效率最高。但是在经历大量插入删除后还要保持满二叉树(多数情况只能是完全二叉树)的状态,这种约束太过严格,需要大量的维护操作,并不现实。
红黑树放宽了这种约束,只要求最长的路径长度不超过最短的两倍,在修改和查询效率之间做了平衡。

AVL树

AVL树的平衡约束是,树中任何节点的两个子树的高度最大差别为1。这是比红黑树更严格的约束,因此AVL树在修改时需要进行更多的维护,理论上查询效率也会比红黑树更高。但是工程上这个查询效率的优势并不明显,大多数应用还是采用红黑树而不是AVL树。

参考文献

红黑树
2-3-4树
AVL树

原创粉丝点击