对于红黑树,任何不平衡都会在三次旋转内解决?

对于红黑树,任何不平衡都会在三次旋转内解决?

老师,我看在这篇文章中说了“对了红黑树,任何不平衡都会在三次旋转内解决”我不能够理解这句话。


假设一个高度为10的红黑树,我在最后一层添加一个元素至3-节点中,然后一路往上直到根节点都是3-节点,也就是树高加1的情况,而每次往上插入的时候都碰巧插入到3-节点的中链接或者是左链接,也就是每次插入都至少需要一次旋转操作,这样下来不是肯定会超过三次旋转吗?


关于我们课程中的左倾红黑树可能确实没有“任何不平衡都会在三次旋转内解决”这样的性能优势。我在网上也有了解过与2-3-4树对应的红黑树,与上述的情况相同,如果我在第10层的位置插入一个元素到一个4-节点中,再一路往上直到根节点都是4-节点,那么旋转的次数也是会超过三次的。


老师,请问“对于红黑树,任何不平衡都会在三次旋转内解决”这句话应该怎么理解

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

因为这个课程没有实现一个非“左倾红黑树”,所以我只能相对“感性”地来阐述这个问题。而实际上,如果 case by case 的解释清楚这个问题,也会比较复杂,因为一棵镇针对各红黑树(非左倾红黑树),田家河删除需要考虑的情况达 6 种之多(而非左倾红黑树的 3 种。)


简单来说,你说的情况不存在。如果添加了一个节点,在 10 层的高度,每次往上走都需要通过旋转才能调整平衡,那么这棵树肯定最初就不会是平衡的。(不满足红黑树定义的平衡。)


这里的另一个关键在于,对于一个真正的红黑树(非左倾红黑树)来说,红节点是可以右倾的。也就是一个黑节点,可以左右两个节点都是红节点。一个核心在于,真正的红黑树,红节点是可以在右倾的。这使得每添加一个红色节点,这个红色节点不一定往上传。


比如:

         15B
        /  \
     10(R)  17B
     /  \
   7(B)  12(B)
  /   
 3(R)


如果添加一个 1

           15(B)
          /   \
        10(R)  17(B)
        /   \
      7(B)   12(B)
     /   
   3(R)
   /
 1(R)


对于左倾红黑树,在 7 左旋转:

            15(B)
          /    \
        10(R)   17(B)
        /   \
      3(B)   12(B)
     /   \
   1(R)   7(R)


此时,在 3 要做 flip colors:

          15(B)
          /    \
        10(R)   17(B)
        /   \
      3(R)   12(B)
     /   \
   1(B)   7(B)


之后,10R 和 3R 又是两个连续的红节点,于是又要旋转。


但是对于没有做请要求的红黑树,在 flip colors 之前的这棵树:

            15(B)
          /    \
        10(R)   17(B)
        /   \
      3(B)   12(B)
     /   \
   1(R)   7(R)


他已经满足红黑树的定义了(最关键的是黑平衡),所以,已经不需要后续的操作了,也就不需要继续旋转了。


随便举了一个例子,说明如果没有“左倾”这个条件,其实维护红黑树的性质,需要的旋转更少了。但因为可以右倾,所以,分类讨论的情况变多了,变复杂了。


继续加油!:)

  • 慕用3648452 提问者 #1

    老师,一般的红黑树就是与2-3-4树对应的红黑树吗?

    2021-08-04 00:13:14
  • liuyubobobo 回复 提问者 慕用3648452 #2

    liuyubobobo: 是的。

    2021-08-04 14:38:35
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师