红黑树最多三次旋转达到平衡

2020-01-21  本文已影响0人  jianshujoker

一点基础

五个性质

  1. 节点是红色或黑色
  2. 根节点是黑色
  3. 所有叶子节点是黑色(叶子节点是NIL节点,为了性质5到叶子节点具有相同数目黑色节点)
  4. 从每个叶子到根的所有路径上不能有两个连续的红色节点
  5. 从任一节点到其叶子的所有路径包含相同数目黑色节点

旋转

左旋

左旋.png

右旋

右旋.png

子节点

插入

  1. 没有父亲节点,父亲节点无颜色,插入子节点作为新的根节点,变为黑色,结束;
  2. 父亲节点为黑色,插入子节点未破坏任何性质,结束;
  3. 父亲节点为红色,可以分为两种情况讨论
    1. 叔叔节点为红色
    2. 叔叔节点为黑色子节点或叶子节点,可以根据插入子节点是否与父亲节点在同一边,分为两种情况讨论
      1. 和父亲节点不在同一边
      2. 和父亲节点在同一边

旋转次数

父亲为红色子节点的三种情况

父叔都为红

父红叔不为红,插入子节点和父亲不在同一边

父红叔不为红,插入子节点和父亲在同一边

删除

有二个子节点

有一个子节点

没有子节点

  1. 删除节点是红色,删除不影响红黑树性质,直接删除

  2. 删除节点是黑色

    • 问题:到删除节点这里的叶子节点的路径上少了个黑色节点,违反了性质5

    • 思路

      • 减少一个删除节点父亲节点到叶子节点路径的黑色节点,把父亲节点当做新的填充上去的节点(第一次填充的是叶子节点),递归处理
      • 在不增加另一边父亲节点到叶子节点的黑色节点数量的情况下,将删除节点这边增加个黑色节点
    • 情形(N:代表删除节点被移除后,补上去的节点,最开始是叶子节点(NIL))

      1. N是新的根,结束
      2. 兄弟是红色
      3. 兄弟是黑色
        1. 兄弟的儿子都是黑色
          1. 父亲节点是黑色
          2. 父亲节点是红色
        2. 兄弟的儿子有红色
          1. 兄弟儿子与兄弟同边的是黑色
          2. 兄弟儿子与兄弟同边的是红色

      这就是当删除节点没有子节点并且删除节点是黑色的时候所有的情形了,它的平衡流程图如下:


      无子节点流程图.PNG

旋转次数

兄弟是红色

兄弟黑色、兄儿子黑色、父亲节点黑色

兄弟黑色、兄儿子是黑色、父亲节点是红色

兄弟黑色、兄儿子与兄同边红色,另一边红黑都可、父亲节点颜色红黑都可

兄弟黑色、兄儿子与兄不同边红色,同边黑色、父亲节点颜色红黑都可

小结

参考:红黑树-维基百科

上一篇 下一篇

猜你喜欢

热点阅读