通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

红黑树的根节点为什么要是黑的

红黑树的根节点是黑色的原因:在红黑树中,规定根节点必须是黑色节点,是为了满足红黑树性质中的红黑性和黑高性。根节点是黑色的,这样就能保证根节点到所有叶子节点的路径上的黑节点数量一致,同时满足红黑树的性质。

一、红黑树的根节点是黑色的原因

红黑树是一种自平衡二叉搜索树,它的节点可以是黑色或红色的。在红黑树中,规定根节点必须是黑色节点,这是为了满足红黑树性质中的两个条件:红黑性和黑高性。

具体来说,红黑树性质包括:

  1. 每个节点是红色或黑色的。
  2. 根节点是黑色的。
  3. 每个叶子节点(即空节点)是黑色的。
  4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
  5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同个数的黑色节点,称为该节点的黑高度。

根据以上性质,如果根节点不是黑色的,那么第三个性质就无法保证,也就是说,叶子节点可能是红色的,这显然是不符合红黑树性质的。

因此,为了满足红黑树性质,规定红黑树的根节点必须是黑色节点,这样就能保证根节点到所有叶子节点的路径上的黑节点数量一致,同时满足红黑性和黑高性。

二、红黑树介绍

1、概念

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。

2、性质

  • 每个结点不是红色就是黑色。
  • 根节点是黑色的。
  • 如果一个节点是红色的,则它的两个孩子结点是黑色的(不会出现连在一起的红色节点)。
  • 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点(在计算一条路径中黑色节点个数的时候要带上叶子节点,因为叶子节点也是黑色的,也就是空节点)。
  • 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)(为了保证空树也是红黑树)。
  • 红黑树确保没有一条路径会比其他路径长出俩倍(红黑树前面的性质保证了当前的性质)。

3、操作

红黑树的基本操作和其他树形结构一样,一般都包括查找、插入、删除等操作。前面说到,红黑树是一种自平衡的二叉查找树,既然是二叉查找树的一种,那么查找过程和二叉查找树一样,比较简单,这里不再赘述。相对于查找操作,红黑树的插入和删除操作就要复杂的多。尤其是删除操作,要处理的情况比较多,不过大家如果静下心来去看,会发现其实也没想的那么难。好了,废话就说到这,接下来步入正题吧。

  • 旋转操作:旋转操作分为左旋和右旋,左旋是将某个节点旋转为其右孩子的左孩子,而右旋是节点旋转为其左孩子的右孩子。
  • 插入:红黑树的插入过程和二叉查找树插入过程基本类似,不同的地方在于,红黑树插入新节点后,需要进行调整,以满足红黑树的性质。性质1规定红黑树节点的颜色要么是红色要么是黑色,那么在插入新节点时,这个节点应该是红色还是黑色呢?答案是红色,原因也不难理解。如果插入的节点是黑色,那么这个节点所在路径比其他路径多出一个黑色节点,这个调整起来会比较麻烦(参考红黑树的删除操作,就知道为啥多一个或少一个黑色节点时,调整起来这么麻烦了)。如果插入的节点是红色,此时所有路径上的黑色节点数量不变,仅可能会出现两个连续的红色节点的情况。这种情况下,通过变色和旋转进行调整即可,比之前的简单多了。所以插入的时候将节点设置为红色,可以保证满足性质 1、2、3、5 ,只有性质4不一定满足,需要进行相关调整。如果是添加根节点,则将节点设定为黑色。
  • 删除:相较于插入操作,红黑树的删除操作则要更为复杂一些。删除操作首先要确定待删除节点有几个孩子,如果有两个孩子,不能直接删除该节点。而是要先找到该节点的前驱(该节点左子树中最大的节点)或者后继(该节点右子树中最小的节点),然后将前驱或者后继的值复制到要删除的节点中,最后再将前驱或后继删除。

4、效率

红黑树的查找,插入和删除操作,时间复杂度都是O(logN)。查找操作时,它和普通的相对平衡的二叉搜索树的效率相同,都是通过相同的方式来查找的,没有用到红黑树特有的特性。但如果插入的时候是有序数据,那么红黑树的查询效率就比二叉搜索树要高了,因为此时二叉搜索树不是平衡树,它的时间复杂度O(N)。插入和删除操作时,由于红黑树的每次操作平均要旋转一次和变换颜色,所以它比普通的二叉搜索树效率要低一点,不过时间复杂度仍然是O(logN)。总之,红黑树的优点就是对有序数据的查询操作不会慢到O(logN)的时间复杂度。

和AVL树的比较:

  • AVL树的时间复杂度虽然优于红黑树,但是对于现在的计算机,cpu太快,可以忽略性能差异
  • 红黑树的插入删除比AVL树更便于控制操作
  • 红黑树整体性能略优于AVL树(红黑树旋转情况少于AVL树)

5、平衡

AVL是靠平衡因子来保持平衡的,比如平衡因子为1,那么左右子树的高度差就不能超过1,是一种强平衡。对于红黑树而言,为何那5条性质,就能保证红黑树是平衡的?因为那5条性质,可以保证红黑树等价于4阶B树。B树比较矮,它本身就是平衡的,高度越小越平衡。红黑树就是能保证这个树高度不会特别高,红黑树的最大高度是 2 ∗ log2(n + 1) ,依然是 O(logn) 级别,因为高度不会很大进而维持一种相对平衡的状态。相比AVL树,红黑树的平衡标准比较宽松:没有一条路径会大于其他路径的2倍。这是是一种弱平衡、黑高度平衡(黑高度只算黑色节点个数,红黑树的任何一条路径的黑色节点数一样,则黑高度都是一样)。

6、平均时间复杂度

  • 搜索:O(logn)
  • 添加:O(logn),O(1) 次的旋转操作
  • 删除:O(logn),O(1) 次的旋转操作

延伸阅读1:AVL树是什么

AVL 树是一种平衡二叉树,得名于其发明者的名字( Adelson-Velskii 以及 Landis)。平衡二叉树递归定义如下:

  • 左右子树的高度差小于等于 1。
  • 其每一个子树均为平衡二叉树。

基于这一句话,我们就可以进行判断其一棵树是否为平衡二叉了。

相关文章