1 #include <iostream>
2 #include <ctime>
3 #include <cassert>
4 #include <sstream>
5 using namespace std;
6
7 #include "red_black_tree.h"
8
9 //静态成员变量初始化
10 template<typename TKey, typename TValue>
11 typename RBTree<TKey, TValue>::RBTreeNode * RBTree<TKey, TValue>::m_pNil = NULL;
12
13 template<typename TKey, typename TValue>
14 RBTree<TKey, TValue>::RBTree()
15 {
16 if ( !m_pNil ) {
17 //叶结点是一个特殊的黑结点
18 m_pNil = new RBTreeNode();
19 m_pNil->Color = BLACK;
20 }
21 m_pRoot = m_pNil;
22 }
23
24 template<typename TKey, typename TValue>
25 RBTree<TKey, TValue>::~RBTree()
26 {
27 _RecursiveReleaseNode( m_pRoot );
28 }
29
30 template<typename TKey, typename TValue>
31 void RBTree<TKey, TValue>::_RecursiveReleaseNode( RBTreeNode *node )
32 {
33 if ( node->isValid() ) {
34 _RecursiveReleaseNode( node->Left );
35 _RecursiveReleaseNode( node->Right );
36 delete node;
37 }
38 }
39
40 template<typename TKey, typename TValue>
41 bool RBTree<TKey, TValue>::Empty()
42 {
43 return !(m_pRoot->isValid());
44 }
45
46 //左旋
47 template<typename TKey, typename TValue>
48 void RBTree<TKey, TValue>::_LeftRotate( RBTreeNode *x_node )
49 {
50 //assert
51 if ( !(x_node->isValid() && x_node->Right->isValid()) )
52 throw exception( "左旋操作要求对非哨兵进行操作,并且要求右孩子也不是哨兵" );
53
54 RBTreeNode *y_node = x_node->Right;
55
56 //以下三步的宗旨是用 y 替换 x,注意将 x 的Parent、Left、Right都换成 y 的
57 // 1) x 和 y 分离 (补)
58 x_node->Right = y_node->Left;
59 if (y_node->Left != m_pNil)
60 y_node->Left->Parent = x_node;
61
62 // 2) 设置y->Parent (提)
63 y_node->Parent = x_node->Parent;
64 if (x_node->Parent == m_pNil)
65 m_pRoot = y_node;
66 else if (x_node->Parent->Left == x_node)
67 x_node->Parent->Left = y_node;
68 else
69 x_node->Parent->Right = y_node;
70
71 // 3) 设置y->Left (降)
72 y_node->Left = x_node;
73 x_node->Parent = y_node;
74 }
75
76 //右旋
77 template<typename TKey, typename TValue>
78 void RBTree<TKey, TValue>::_RightRotate( RBTreeNode *x_node )
79 {
80 //assert
81 if ( !(x_node->isValid() && x_node->Left->isValid()) )
82 throw exception( "右旋操作要求对非哨兵进行操作,并且要求左孩子也不是哨兵" );
83 RBTreeNode *y_node = x_node->Left;
84
85 //以下三步的宗旨是用 y 替换 x,注意将 x 的Parent、Left、Right都换成 y 的
86 // 1) x 和 y 分离 (补)
87 x_node->Left = y_node->Right;
88 if (y_node->Right != m_pNil)
89 y_node->Right->Parent = x_node;
90
91 // 2) 设置y->Parent (提)
92 y_node->Parent = x_node->Parent;
93 if (x_node->Parent == m_pNil)
94 m_pRoot = y_node;
95 else if (x_node->Parent->Right == x_node)
96 x_node->Parent->Right = y_node;
97 else
98 x_node->Parent->Left = y_node;
99
100 // 3) 设置y->Left (降)
101 y_node->Right = x_node;
102 x_node->Parent = y_node;
103 }
104
105 //搜索
106 template<typename TKey, typename TValue>
107 typename RBTree<TKey, TValue>::RBTreeNode* RBTree<TKey, TValue>::Search( TValue const &value )
108 {
109 RBTreeNode *node = m_pRoot;
110 while( node != m_pNil && node->Value != value )
111 node = ((value < node->Value) ? node->Left:node->Right);
112 return node;
113 }
114
115 //插入
116 template<typename TKey, typename TValue>
117 bool RBTree<TKey, TValue>::Insert( TKey key, TValue value )
118 {
119 if ( Search(value)->isValid() )
120 //value 重复,添加失败
121 return false;
122 else {
123 //新添加的节点为红结点,left=right=nil
124 RBTreeNode *new_node = new RBTreeNode();
125 new_node->Key = key;
126 new_node->Value = value;
127 new_node->Color = RED;
128 new_node->Left = new_node->Right = m_pNil;
129
130 //插入
131 _InsertRBTree(new_node);
132 //修复
133 _InsertFixup(new_node);
134 return true;
135 }
136 }
137
138 //真正的插入:与二叉搜索树几乎一样
139 template<typename TKey, typename TValue>
140 void RBTree<TKey, TValue>::_InsertRBTree( RBTreeNode *new_node )
141 {
142 RBTreeNode *current_node = m_pNil;
143 RBTreeNode *next_node = m_pRoot;
144
145 //找到插入点
146 while ( next_node != m_pNil ) {
147 current_node = next_node;
148 next_node = ( new_node->Value < next_node->Value )? next_node->Left: next_node->Right;
149 }
150
151 new_node->Parent = current_node;
152 if ( current_node == m_pNil ) //空树
153 m_pRoot = new_node;
154 else if ( new_node->Value < current_node->Value )
155 current_node->Left = new_node; //插入左子树
156 else
157 current_node->Right = new_node; //插入右子树
158
159 //设置new_node-left-right = nil, color = red
160 new_node->Left = m_pNil;
161 new_node->Right = m_pNil;
162 new_node->Color = RED; //插入结点为红色
163 }
164
165 //插入修复
166 //new_node -> z, uncle_node -> y;
167 template<typename TKey, typename TValue>
168 void RBTree<TKey, TValue>::_InsertFixup( RBTreeNode *new_node )
169 {
170 //////////////////////////////////////////////////////////////////////////
171 //啰嗦的写法
172 /*
173 while ( new_node->Parent->Color == RED ) {
174 RBTreeNode *uncle_node = new RBTreeNode();
175 if ( new_node->Parent == new_node->Parent->Parent->Left ) { //new的父结点为祖父结点的左孩子
176 uncle_node = new_node->Parent->Right; //uncle结点在右边
177
178 if ( uncle_node->Color == RED ) { //case1: new 的叔结点为红色
179 new_node->Color = BLACK;
180 uncle_node->Color = BLACK;
181 new_node->Parent->Color = RED;
182 new_node = new_node->Parent->Parent;
183 }
184
185 else if ( uncle_node->Color == BLACK && new_node->Parent->Right ) //case2: new 叔结点为黑色且new是一个右孩子
186 _LeftRotate( new_node->Parent );
187
188 new_node->Parent->Color = BLACK; //case3: new 叔结点为黑色且new是左孩子
189 new_node->Parent->Parent->Color = RED;
190 _RightRotate( new_node->Parent->Parent );
191 }
192 else { //和上面对称的相同操作
193 ///
194 }
195 }
196 */
197 //////////////////////////////////////////////////////////////////////////
198 //精炼的写法
199 while ( new_node->Parent->Color == RED ) {
200
201 //标识new的父结点是否是祖父结点的左孩子
202 bool parent_is_left_child_flag = ( new_node->Parent == new_node->Parent->Parent->Left );
203 RBTreeNode *uncle_node = ( parent_is_left_child_flag ? new_node->Parent->Parent->Right: new_node->Parent->Parent->Left );
204
205 if ( uncle_node->Color == RED ) { //case1: new 的叔结点为红色
206 new_node->Parent->Color = BLACK; //!!!
207 uncle_node->Color = BLACK;
208 new_node->Parent->Parent->Color = RED; //!!!这两个地方写错了,tmd,还得老子改了大半天
209 new_node = new_node->Parent->Parent;
210 }
211
212 else {
213 if ( new_node == ( parent_is_left_child_flag ? new_node->Parent->Right: new_node->Parent->Left ) ) {//case2: new 叔结点为黑色且new是一个右孩子
214 new_node = new_node->Parent;
215 parent_is_left_child_flag ? _LeftRotate( new_node ):_RightRotate( new_node );
216 }
217
218 new_node->Parent->Color = BLACK; //case3: new 叔结点为黑色且new是左孩子
219 new_node->Parent->Parent->Color = RED;
220 parent_is_left_child_flag ? _RightRotate( new_node->Parent->Parent ): _LeftRotate( new_node->Parent->Parent );
221 }
222 }
223 m_pRoot->Color = BLACK;
224 }
225
226 //删除
227 template<typename TKey, typename TValue>
228 bool RBTree<TKey, TValue>::Delete( TKey key )
229 {
230 //没有找到该结点
231 RBTreeNode *delete_node = Search( key );
232 if ( !(delete_node->isValid()) ) //!isValid()
233 return false;
234 else {
235 _Delete( delete_node );
236 return true;
237 }
238 }
239
240 //真正的删除
241 //形如二叉搜索树的删除,只不过需要记录待删除节点的右孩子的颜色值
242 //delete_node -> z; min_node -> y; temp_node -> x
243 template<typename TKey, typename TValue>
244 void RBTree<TKey, TValue>::_Delete( RBTreeNode *delete_node )
245 {
246 RBTreeNode *temp_node = delete_node;
247 int color = delete_node->Color; //记录待删除结点原来的颜色
248
249 if ( delete_node->Left == m_pNil ) { //左孩子为空
250 temp_node = delete_node->Right;
251 _RB_Transplant( delete_node, delete_node->Right );
252 }
253 else if ( delete_node->Right == m_pNil ) {//右孩子为空
254 temp_node = delete_node->Left;
255 _RB_Transplant( delete_node, delete_node->Left );
256 }
257 else {
258 RBTreeNode *min_node = _Minimum( delete_node->Right ); //delete的后继结点min_node
259 temp_node = min_node->Right;
260 color = min_node->Color; //更新color
261
262 if ( min_node->Parent == delete_node )
263 temp_node->Parent = min_node;
264
265 else {
266 _RB_Transplant( min_node, min_node->Right );
267 min_node->Right = delete_node->Right;
268 min_node->Right->Parent = min_node;
269 }
270 _RB_Transplant( delete_node, min_node );
271 min_node->Left = delete_node->Left;
272 min_node->Left->Parent = min_node;
273 min_node->Color = delete_node->Color;
274 }
275 if ( color == BLACK )
276 _DeleteFixup( temp_node ); //template_node x
277 }
278
279 //删除修复
280 template<typename TKey, typename TValue>
281 void RBTree<TKey, TValue>::_DeleteFixup( RBTreeNode *node )
282 {
283 while ( node != m_pRoot && node->Color == BLACK ) {
284 //标识node是否是其父结点的左孩子
285 bool node_is_left_child_flag = ( node == node->Parent->Left );
286 //node的兄弟节点
287 RBTreeNode *brother = ( node_is_left_child_flag ? node->Parent->Right : node->Parent->Left );
288
289 //case1 node的兄弟结点为红色,一次旋转操作变成case2
290 if ( brother->Color == RED ) {
291 node->Parent->Color = RED;
292 brother->Color = BLACK;
293 node_is_left_child_flag ? _LeftRotate( node->Parent ):_RightRotate( node->Parent );
294
295 //更新brother结点
296 brother = ( node_is_left_child_flag ? node->Parent->Right : node->Parent->Left );
297 }
298
299 //case2 node 的兄弟结点为黑色,且brother两个孩子结点皆为黑色
300 if ( brother->Left->Color == BLACK && brother->Right->Color == BLACK ) {
301 brother->Color = RED;
302 node = node->Parent; //node更新为上一层
303 }
304
305 //case3 node的兄弟结点为黑色,且brother的左孩子为红色,右孩子为黑色
306 else {
307 if ( ( node_is_left_child_flag ? brother->Right->Color : brother->Left->Color ) == BLACK ) {
308 brother->Color = RED;
309 //注意左右的不同
310 ( node_is_left_child_flag ? brother->Left->Color : brother->Right->Color ) = BLACK;
311 node_is_left_child_flag ? _RightRotate( brother ):_LeftRotate( brother );
312 brother = ( node_is_left_child_flag ? node->Parent->Right:node->Parent->Left ); //更新brother结点 -> 变成case4
313 }
314
315 //case4 node结点的兄弟结点为黑色,且brother 结点的右孩子为红色
316 brother->Color = /*node->Parent->Color*/RED;
317 node->Parent->Color = BLACK;
318
319 ( node_is_left_child_flag ? brother->Right->Color : brother->Left->Color ) = BLACK;
320 node_is_left_child_flag ? _LeftRotate( node->Parent ):_RightRotate( node->Parent );
321
322 node = m_pRoot; //最后赋给root
323 }
324 }
325 //最后只需要简单置x为黑结点就可以,_root的改变已经由左右旋自动处理了
326 node->Color = BLACK;
327 }
328
329 //RB替换操作
330 template<typename TKey, typename TValue>
331 void RBTree<TKey, TValue>::_RB_Transplant( RBTreeNode *unode, RBTreeNode *vnode )
332 {
333 if ( unode->Parent == m_pNil )
334 m_pRoot = vnode;
335 else if ( unode->Parent->Left == unode )
336 unode->Parent->Left = vnode;
337 else
338 unode->Parent->Right = vnode;
339 vnode->Parent = unode->Parent; //!!!别漏了
340 }
341
342 //显示
343 template<typename TKey, typename TValue>
344 void RBTree<TKey, TValue>::Display() const
345 {
346 _Display( m_pRoot );
347 std::cout << std::endl;
348 }
349
350 template<typename TKey, typename TValue>
351 void RBTree<TKey, TValue>::_Display( RBTreeNode *node ) const
352 {
353 // if ( node->isValid() ) {
354 // cout << node->Value << " ";
355 // if (node->Left->isValid())
356 // _Display(node->Left);
357 // if (node->Right->isValid())
358 // _Display(node->Right);
359 // }
360 if ( node->Parent == m_pNil )
361 cout << "root: " << node->Value << "( " << node->Color << " )" << endl;
362 else if ( node->Parent->Left == node )
363 cout << "left: " << node->Value << "( " << node->Color << " )" << " " << "parent: " << node->Parent->Value << "( " << node->Parent->Color << " )" << endl;
364 else cout << "right: " << node->Value << "( " << node->Color << " )" << " " << "parent: " << node->Parent->Value << "( " << node->Parent->Color << " )" << endl;
365 if ( node->Left->isValid() )
366 _Display(node->Left);
367 if ( node->Right->isValid() )
368 _Display(node->Right);
369 }
370
371 //@brief 后继
372 template<typename TKey, typename TValue>
373 typename RBTree<TKey, TValue>::RBTreeNode * RBTree<TKey, TValue>::_Successor( RBTreeNode *node )
374 {
375 if(node->m_pRight)
376 return _GetMaximum(node);
377
378 _Node *pTemp = node->m_pParent;
379 while (pTemp && node == pTemp->m_pRight ) {
380 node = pTemp;
381 pTemp = pTemp->m_pParent;
382 }
383 return pTemp;
384 }
385
386 //@brief 前驱
387 template<typename TKey, typename TValue>
388 typename RBTree<TKey, TValue>::RBTreeNode * RBTree<TKey, TValue>::_Predecessor( RBTreeNode *node )
389 {
390 if (node->m_pLeft)
391 return _GetMinimum(node);
392
393 _Node *pTemp = node->m_pParent;
394 while (pTemp && node == pTemp->m_pLeft) {
395 node = pTemp;
396 pTemp = pTemp->m_pParent;
397 }
398 return pTemp;
399 }
400
401 //@brief Maximum
402 template<typename TKey, typename TValue>
403 typename RBTree<TKey, TValue>::RBTreeNode * RBTree<TKey, TValue>::_Maximum( RBTreeNode *node )
404 {
405 while( node->Right != m_pNil ) {
406 node = node->Right;
407 }
408 return node;
409 }
410
411 //@brief Minimum
412 template<typename TKey, typename TValue>
413 typename RBTree<TKey, TValue>::RBTreeNode * RBTree<TKey, TValue>::_Minimum( RBTreeNode *node )
414 {
415 while( node->Left != m_pNil ) {
416 node = node->Left;
417 }
418 return node;
419 }
420
421 int main()
422 {
423 srand((unsigned)time(NULL));
424 RBTree<int, int> rbt;
425 int ninsert[] = {12, 1, 9, 2, 0, 11, 7, 19, 4, 15, 18, 5, 14, 13, 10, 16, 6, 3, 8, 17};
426 //int ninsert[] = {3,7,12,10,14,15,16,17,21,19,20,23,26,41,30,28,38,35,39,47};
427 int n = sizeof(ninsert)/sizeof(ninsert[0]);
428
429 //用随机值生成一棵二叉查找树
430 for ( int i = 0; i < n; ++i )
431 {
432 //int v = rand() % 100;
433 rbt.Insert( ninsert[i], ninsert[i] );
434 //rbt.Insert( i, i );
435 }
436 rbt.Display();
437
438 // for ( int i = 0; i < n; i ++)
439 // rbt.Delete( ninsert[i] );
440
441 // 删除所有的小奇数
442 for ( int i = 1; i < n; ++i )
443 {
444 if ( i % 2 == 1 /*&& i < 50*/ )
445 {
446 if ( rbt.Delete( i ) )
447 {
448 cout << "Deleted [" << i << "]" << endl;
449 }
450 }
451 }
452 rbt.Display();
453 // //删除所有的大偶数
454 // for ( int i = 0; i < 100; ++i )
455 // {
456 // if ( i % 2 == 0 && i > 50 )
457 // {
458 // if ( rbt.Delete( i ) )
459 // {
460 // cout << "Deleted [" << i << "]" << endl;
461 // }
462 // }
463 // }
464 // rbt.Display();
465
466 return 0;
467 }