算法导论第三版--红黑树

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

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 }
原文地址:https://www.cnblogs.com/danxi/p/6538646.html