红黑树

本文详细解析了红黑树的插入操作,强调了红黑树的五个规则,并介绍了如何通过颜色调整和旋转来保持红黑树的平衡。重点讨论了在不同情况下的插入操作和调整策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      这几天在看红黑树,发现侯捷说得不清不楚,一气之下,回头看《算法导论》。这才把红黑树的插入操作思路弄清楚,心中有一种恍然大悟的感觉!

      感觉还是《算法导论》牛逼呀!我也照着说说红黑树的插入操作吧。

      红黑树是一棵满足一下规则的平衡二叉搜索树(平衡条件比AVL-tree弱,感到不可思议,因为我觉得rb-tree比AVL-tree复杂): 

      1. 每个节点不是红色就是黑色。

      2. 根节点是黑色。

      3. 每个“叶子节点”是黑色。这里的叶子节点是哨兵,就是原本的二叉树的叶子节点全部连到一个黑色的节点上。

      4. 如果一个节点是红色,那么它的左右节点都是黑色。

      5. 从根节点到每个叶子节点的路径中,黑节点的个数都相等。

 

      我们先按照二叉搜索树的规则插入节点,按照以上条件,我们可以知道:新增节点必须是红色——规则5。我们有可能违反的规则只有2和4 。如果新增节点的父节点是黑色,没有违反红黑树的条件;如果新增节点的父节点是红色,则违反了规则4——我们先考虑4,违反规则2是一种比较特殊的情况。

     

      发现《STL源码剖析》中P211的状况3和状况4和书中后面的代码不符合,实际上不用这么复杂!

 

      现在,总结一下红黑树的插入操作:先按照二叉搜索树的插入规则插入新节点z,标记为红色——否则违背规则5 。如果z的父节点pz为黑色,不会违反红黑树的特性,OK。现在只有 z为红,pz 也为红这种情况需要调整红黑树。

     我们分为两类:

     左图为类一,其中新插入节点z也可以是右孩子;右图为类二,其中新插入节点z也可以是左孩子。蓝色视为黑色。

 

 针对类一,有三种情况,我们不讨论类二,因为它的情况类似类一。

 

 case 1:新节点 z 也可以是 pz 的右孩子。我们只需要简单的调整一下 ppz 节点、pz 节点和 y 节点的颜色。

              然后,ppz 节点为新的 z 节点,递归调用该算法。

          

  case 2 :  这里有两个阶段,先是调整 ppz 、pz 节点的颜色,接着对 ppz 节点进行右旋转操作。算法结束,不用递归调用。

           

     case 3 :直接对节点 pz 进行左旋转操作,pz 节点为新的 z 节点,即回到了case 2 状况。

             

      由图上分析可以知道,这是一个自下而上的调整过程,时间复杂度是O(lgn)。《算法导论》和SGI STL 的具体实现都是差不多的,只不过SGI STL 里的 rb-tree 多了一个 header 节点,这点需注意。

      好了,今天就到这里,下次写写 rb-tree 的删除操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值