zoukankan      html  css  js  c++  java
  • 算法导论第三版--红黑树

    红黑树是满足如下条件的二叉搜索树。

    1、每个节点要么是红色的,要么是黑色的。

    2、根节点是黑色。

    3、每个叶子节点是黑色的。

    4、如果一个节点是红色的,那么它的2个子节点是黑色的。

    5、对每个节点,从它到它的后代叶子节点的简单路径上,均包含相同数目的黑色节点。

    练习完这些代码,我感觉我把stl的rbtree抄了一遍。。。

      1 enum RB {
      2     RED,
      3     BLACK
      4 };
      5 
      6 template<typename T>
      7 struct rb_node_cls {
      8     typedef rb_node_cls<T> __node;
      9     __node* parent;
     10     __node* left;
     11     __node* right;
     12     T key;
     13     RB color;
     14     void *data;
     15 };
     16 
     17 template<typename T> using rbt_node = rb_node_cls<T>;
     18 
     19 template<typename T>
     20 struct rb_tree_cls {
     21    rbt_node<T>* root;
     22 };
     23 
     24 template<typename T> using rb_tree = rb_tree_cls<T>;
     25 
     26 template<typename T>
     27 void left_rotate(rb_tree<T>& tree, rbt_node<T>* x) {
     28     rbt_node<T>* y = x->right;
     29 
     30     x->right = y->left;
     31     if (y->left != nullptr) {
     32         y->left->parent = x;
     33     }
     34 
     35     y->parent = x->parent;
     36     if(x->parent == nullptr) {
     37         tree.root = y;
     38     } else if(x == x->parent->left) {
     39         x->parent->left = y;
     40     } else {
     41         x->parent->right = y;
     42     }
     43 
     44     y->left = x;
     45     x->parent = y;
     46 }
     47 
     48 template<typename T>
     49 void right_rotate(rb_tree<T>& tree, rbt_node<T>* x) {
     50     rbt_node<T>* y = x->left;
     51 
     52     y->left = x->right;
     53 
     54     if(x->right != nullptr) {
     55         x->right->parent = y;
     56     }
     57 
     58     x->parent = y->parent;
     59     if(y->parent == nullptr) {
     60         tree.root = y;
     61     } else if (y == y->parent->left) {
     62         y->parent->left = x;
     63     } else {
     64         x->parent->right = x;
     65     }
     66 
     67     x->right = y;
     68     y->parent = x;
     69 }
     70 
     71 template<typename T>
     72 void rb_insert_fixup(rb_tree<T>& tree, rbt_node<T>* z) {
     73     while(z->parent->color == RED) {
     74         if(z->parent == z->parent->parent->left) {
     75             rbt_node<T>* y = z->parent->parent->right;
     76             if(y->color == RED){
     77                 z->parent->color = BLACK;
     78                 y->color = BLACK;
     79                 z->parent->parent = RED;
     80                 z = z->parent->parent;
     81             } else if(z == z->parent->right) {
     82                 z = z->parent;
     83                 left_rotate(tree, z);
     84             }
     85             z->parent->color = BLACK;
     86             z->parent->parent->color = RED;
     87             right_rotate(tree, z->parent->parent);
     88         } else {
     89             rbt_node<T>* y = z->parent->parent->left;
     90             if(y->color == RED) {
     91                 z->parent->color = BLACK;
     92                 y->color = BLACK;
     93                 z->parent->parent = RED;
     94                 z = z->parent->parent;
     95             } else if(z == z->parent->left) {
     96                 z = z->parent;
     97                 right_rotate(tree, z);
     98             }
     99             z->parent->color = BLACK;
    100             z->parent->parent->color = RED;
    101             left_rotate(tree, z->parent->parent);
    102         }
    103     }
    104     tree.root->color = BLACK;
    105 }
    106 
    107 template<typename T>
    108 void rb_insert(rb_tree<T>& tree, rbt_node<T>* z) {
    109     rbt_node<T>* y = nullptr;
    110     rbt_node<T>* x = tree.root;
    111 
    112     while(x != nullptr) {
    113         y = x;
    114         x = (z->key < x->key) ? x->left : x->right;
    115     }
    116 
    117     z->parent = y;
    118     if(y == nullptr){
    119         tree.root = z;
    120     } else if(z->key < y->key) {
    121         y->left = z;
    122     } else {
    123         y->right = z;
    124     }
    125 
    126     z->left = nullptr;
    127     z->right = nullptr;
    128     z->color = RED;
    129     rb_insert_fixup(tree, z);
    130 }
    131 
    132 template<typename T>
    133 void rb_transplant(rb_tree<T>& tree, rbt_node<T>* u, rbt_node<T>* v) {
    134     if(u->parent == nullptr) {
    135         tree.root = v;
    136     } else if (u == u->parent->left) {
    137         u->parent->left = v;
    138     } else {
    139         u->parent->right = v;
    140     }
    141     if(v != nullptr)
    142         v->parent = u->parent;
    143 }
    144 
    145 template<typename T>
    146 rbt_node<T>* tree_minimum(rbt_node<T>* node) {
    147     while(node->left != nullptr)
    148         node = node->left;
    149     return node;
    150 }
    151 
    152 template<typename T>
    153 void rb_delete_fixup(rb_tree<T>& tree, rbt_node<T>* x) {
    154     while(x != tree.root && x->color == BLACK) {
    155         if(x == x->parent->left) {
    156             rbt_node<T>* w = x->parent->right;
    157             if(w->color == RED) {
    158                 w->color = BLACK;
    159                 x->parent->color = RED;
    160                 left_rotate(tree, x->parent);
    161                 w = x->parent->right;
    162             }
    163 
    164             if(w->left->color == BLACK && w->right->color == BLACK) {
    165                 w->color = RED;
    166                 x = x->parent;
    167             } else if(w->right->color == BLACK) {
    168                 w->left->color = BLACK;
    169                 w->color = RED;
    170                 right_rotate(tree, w);
    171                 w = x->parent->right;
    172             }
    173 
    174             w->color = x->parent->color;
    175             x->parent->color = BLACK;
    176             w->right->color = BLACK;
    177             left_rotate(tree, x->parent);
    178             x = tree.root;
    179         } else {
    180             rbt_node<T>* w = x->parent->left;
    181             if(w->color == RED) {
    182                 w->color = BLACK;
    183                 x->parent->color = RED;
    184                 right_rotate(tree, x->parent);
    185                 w = x->parent->left;
    186             }
    187 
    188             if(w->right->color == BLACK && w->left->color == BLACK) {
    189                 w->color = RED;
    190                 x = x->parent;
    191             } else if (w->left->color == BLACK) {
    192                 w->right->color = BLACK;
    193                 w->color = RED;
    194                 left_rotate(tree, w);
    195                 w = x->parent->left;
    196             }
    197 
    198             w->color = x->parent->color;
    199             x->parent->color = BLACK;
    200             x->left->color = BLACK;
    201             right_rotate(tree, x->parent);
    202             x = tree.root;
    203         }
    204     }
    205     x->color = BLACK;
    206 }
    207 
    208 template<typename T>
    209 void rb_delete(rb_tree<T>& tree, rbt_node<T>* z) {
    210     rbt_node<T>* y = z;
    211     rbt_node<T>* x = nullptr;
    212     RB y_original_color = y->color;
    213 
    214     if(z->left == nullptr) {
    215         x = z->right;
    216         rb_transplant(tree, z, z->right);
    217     } else if(z->right == nullptr) {
    218         x = z->left;
    219         rb_transplant(tree, z, z->left);
    220     } else {
    221         y = tree_minimum(z->right);
    222         y_original_color = y->color;
    223         x = y->right;
    224         if(y->parent == z){
    225             x->parent = y;
    226         } else {
    227             rb_transplant(tree, y, y->right);
    228             y->right = z->right;
    229             y->right->parent = y;
    230         }
    231         rb_transplant(tree, z, y);
    232         y->left = z->left;
    233         y->left->parent = y;
    234         y->color = z->color;
    235     }
    236     if(y_original_color == BLACK){
    237         rb_delete_fixup(tree, x);
    238     }
    239 }
  • 相关阅读:
    vs 编译加速
    leetcode 1405
    sort 从大到小从小到大
    leetcode1404
    leetcode 1406
    leetcode 1556
    杭电研究生自动登录联网脚本
    Cannot mix incompatible Qt library (version ) with this library (version ) 解决方案
    目标检测算法优化技巧
    特征工程和模型融合--机器学习--思维导图和笔记
  • 原文地址:https://www.cnblogs.com/danxi/p/6538646.html
Copyright © 2011-2022 走看看