zoukankan      html  css  js  c++  java
  • 红黑树简介

    RB-INSERT-FIXUP(T, z)
    while color[p[z]] = RED                                                  // 若“当前节点(z)的父节点是红色”,则进行以下处理。
        do if p[z] = right[p[p[z]]]                                          // 若“z的父节点”是“z的祖父节点的右孩子”,则进行以下处理。
              then y ← left[p[p[z]]]                                         // 将y设置为“z的叔叔节点(z的祖父节点的左孩子)”
                   if color[y] = RED                                         // Case 1条件:叔叔是红色
                      then color[p[z]] ← BLACK                    ▹ Case 1   //  (01) 将“父节点”设为黑色。
                           color[y] ← BLACK                       ▹ Case 1   //  (02) 将“叔叔节点”设为黑色。
                           color[p[p[z]]] ← RED                   ▹ Case 1   //  (03) 将“祖父节点”设为“红色”。
                           z ← p[p[z]]                            ▹ Case 1   //  (04) 将“祖父节点”设为“当前节点”(红色节点)
                      else if z = left[p[z]]                                // Case 2条件:叔叔是黑色,且当前节点是左孩子
                              then z ← p[z]                       ▹ Case 2   //  (01) 将“父节点”作为“新的当前节点”。
                                   RIGHT-ROTATE(T, z)             ▹ Case 2   // (02) 以“新的当前节点”为支点进行右旋。
                              color[p[z]] ← BLACK                 ▹ Case 3   // Case 3条件:叔叔是黑色,且当前节点是右孩子。(01) 将“父节点”设为“黑色”。
                              color[p[p[z]]] ← RED                ▹ Case 3   //  (02) 将“祖父节点”设为“红色”。
                              LEFT-ROTATE(T, p[p[z]])             ▹ Case 3   //  (03) 以“祖父节点”为支点进行左旋。
           else (same as then clause with "right" and "left" exchanged)      // 若“z的父节点”是“z的祖父节点的右孩子”,将上面的操作中“right”和“left”交换位置,然后依次执行。
    color[root[T]] ← BLACK
    RB-INSERT-FIXUP(T, z)
    while color[p[z]] = RED                                                  // 若“当前节点(z)的父节点是红色”,则进行以下处理。
        do if p[z] = left[p[p[z]]]                                           // 若“z的父节点”是“z的祖父节点的左孩子”,则进行以下处理。
              then y ← right[p[p[z]]]                                        // 将y设置为“z的叔叔节点(z的祖父节点的右孩子)”
                   if color[y] = RED                                         // Case 1条件:叔叔是红色
                      then color[p[z]] ← BLACK                    ▹ Case 1   //  (01) 将“父节点”设为黑色。
                           color[y] ← BLACK                       ▹ Case 1   //  (02) 将“叔叔节点”设为黑色。
                           color[p[p[z]]] ← RED                   ▹ Case 1   //  (03) 将“祖父节点”设为“红色”。
                           z ← p[p[z]]                            ▹ Case 1   //  (04) 将“祖父节点”设为“当前节点”(红色节点)
                      else if z = right[p[z]]                                // Case 2条件:叔叔是黑色,且当前节点是右孩子
                              then z ← p[z]                       ▹ Case 2   //  (01) 将“父节点”作为“新的当前节点”。
                                   LEFT-ROTATE(T, z)              ▹ Case 2   //  (02) 以“新的当前节点”为支点进行左旋。
                              color[p[z]] ← BLACK                 ▹ Case 3   // Case 3条件:叔叔是黑色,且当前节点是左孩子。(01) 将“父节点”设为“黑色”。
                              color[p[p[z]]] ← RED                ▹ Case 3   //  (02) 将“祖父节点”设为“红色”。
                              RIGHT-ROTATE(T, p[p[z]])            ▹ Case 3   //  (03) 以“祖父节点”为支点进行右旋。
           else (same as then clause with "right" and "left" exchanged)      // 若“z的父节点”是“z的祖父节点的右孩子”,将上面的操作中“right”和“left”交换位置,然后依次执行。
    color[root[T]] ← BLACK
    RB-DELETE-FIXUP(T, x)
    while x ≠ T.root and x.color == BLACK  
          if x == x.p.left                                   // 如果x是它父亲的左孩子
                 w = x.p.right                                               // 若 “x”是“它父节点的左孩子”,则设置 “w”为“x的兄弟”(即w为x父节点的右孩子)                                          
                   if w.color == RED                                           // Case 1: x是“黑+黑”节点,x的兄弟是红色。(此时x的父节点和x的叔叔节点的子节点都是黑节点)。
                      then w.color = BLACK                         ▹  Case 1   //   (01) 将x的兄弟节点设为“黑色”。
                           x.p.color = RED                         ▹  Case 1   //   (02) 将x的父节点设为“红色”。
                           LEFT-ROTATE(T, x.p)                     ▹  Case 1   //   (03) 对x的父节点进行左旋。
                           w = x.p.right                           ▹  Case 1   //   (04) 左旋后,重新设置x的兄弟节点。
                   if w.left.color == BLACK and w.right.color == BLACK         // Case 2: x是“黑+黑”节点,x的兄弟节点是黑色,x的兄弟节点的两个孩子都是黑色。
                      then w.color = RED                           ▹  Case 2   //   (01) 将x的兄弟节点设为“红色”。
                           x =  x.p                                ▹  Case 2   //   (02) 设置“x的父节点”为“新的x节点”。
                      else if w.right.color == BLACK                          // Case 3: x是“黑+黑”节点,x的兄弟节点是黑色;x的兄弟节点的左孩子是红色,右孩子是黑色的。
                              then w.left.color = BLACK            ▹  Case 3   //   (01) 将x兄弟节点的左孩子设为“黑色”。
                                   w.color = RED                   ▹  Case 3   //   (02) 将x兄弟节点设为“红色”。
                                   RIGHT-ROTATE(T, w)              ▹  Case 3   //   (03) 对x的兄弟节点进行右旋。
                                   w = x.p.right                   ▹  Case 3   //   (04) 右旋后,重新设置x的兄弟节点。
                            w.color = x.p.color                    ▹  Case 4   // Case 4: x是“黑+黑”节点,x的兄弟节点是黑色;x的兄弟节点的右孩子是红色的。(01) 将x父节点颜色 赋值给 x的兄弟节点。
                            x.p.color = BLACK                      ▹  Case 4   //   (02) 将x父节点设为“黑色”。
                            w.right.color = BLACK                  ▹  Case 4   //   (03) 将x兄弟节点的右子节设为“黑色”。
                            LEFT-ROTATE(T, x.p)                    ▹  Case 4   //   (04) 对x的父节点进行左旋。
                            x = T.root                             ▹  Case 4   //   (05) 设置“x”为“根节点”。
           else (same as then clause with "right" and "left" exchanged)        // 若 “x”是“它父节点的右孩子”,将上面的操作中“right”和“left”交换位置,然后依次执行。
    x.color = BLACK
  • 相关阅读:
    CentOS7 安装 Mysql 服务
    git 第一次 push 遇到问题
    为什么PHP(CLI)同一个错误信息会打印两次?
    python密码输入模块getpass
    Linux安装JDK详细步骤
    嘿嘿嘿,开始自学mysql
    Bable实现由ES6转译为ES5
    AJAX
    模板层
    lshw查看系统硬件信息
  • 原文地址:https://www.cnblogs.com/dupang/p/7813277.html
Copyright © 2011-2022 走看看