青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Networking /C++/Linux

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  11 Posts :: 14 Stories :: 1 Comments :: 0 Trackbacks

常用鏈接

留言簿(4)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

  1 /*-----------------------------------------------------------
  2     RB-Tree的插入和刪除操作的實現算法
  3     參考資料:
  4     1) <<Introduction to algorithm>>
  5     2) [url]http://lxr.linux.no/linux/lib/rbtree.c[/url]
  6 
  7     作者:[url]http://m.shnenglu.com/converse/[/url]
  8     您可以自由的傳播,修改這份代碼,轉載處請注明原作者
  9 
 10     紅黑樹的幾個性質:
 11     1) 每個結點只有紅和黑兩種顏色
 12     2) 根結點是黑色的
 13     3)空節點是黑色的(紅黑樹中,根節點的parent以及所有葉節點lchild、rchild都不指向NULL,而是指向一個定義好的空節點)。 
 14     4) 如果一個結點是紅色的,那么它的左右兩個子結點的顏色是黑色的
 15     5) 對于每個結點而言,從這個結點到葉子結點的任何路徑上的黑色結點
 16     的數目相同
 17 -------------------------------------------------------------*/
 18  
 19 #include <stdio.h>
 20 #include <stdlib.h>
 21 #include <string.h>
 22 
 23 typedef int key_t;
 24 typedef int data_t;
 25 
 26 typedef enum color_t
 27 {
 28     RED = 0,
 29     BLACK = 1
 30 }color_t;
 31 
 32 typedef struct rb_node_t
 33 {
 34     struct rb_node_t *left, *right, *parent;
 35     key_t key;
 36     data_t data;
 37     color_t color;
 38 }rb_node_t;
 39 
 40 /* forward declaration */
 41 rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root);
 42 rb_node_t* rb_search(key_t key, rb_node_t* root);
 43 rb_node_t* rb_erase(key_t key, rb_node_t* root);
 44 
 45 int main()
 46 {
 47     int i, count = 900000;
 48     key_t key;
 49     rb_node_t* root = NULL, *node = NULL;
 50     
 51     srand(time(NULL));
 52     for (i = 1; i < count; ++i)
 53     {
 54         key = rand() % count;
 55         if ((root = rb_insert(key, i, root)))
 56         {
 57             printf("[i = %d] insert key %d success!\n", i, key);
 58         }
 59         else
 60         {
 61             printf("[i = %d] insert key %d error!\n", i, key);
 62             exit(-1);
 63         }
 64 
 65         if ((node = rb_search(key, root)))
 66         {
 67             printf("[i = %d] search key %d success!\n", i, key);
 68         }
 69         else
 70         {
 71             printf("[i = %d] search key %d error!\n", i, key);
 72             exit(-1);
 73         }
 74         if (!(i % 10))
 75         {
 76             if ((root = rb_erase(key, root)))
 77             {
 78                 printf("[i = %d] erase key %d success\n", i, key);
 79             }
 80             else
 81             {
 82                 printf("[i = %d] erase key %d error\n", i, key);
 83             }
 84         }
 85     }
 86 
 87     return 0;
 88 }
 89 
 90 static rb_node_t* rb_new_node(key_t key, data_t data)
 91 {
 92     rb_node_t *node = (rb_node_t*)malloc(sizeof(struct rb_node_t));
 93 
 94     if (!node)
 95     {
 96         printf("malloc error!\n");
 97         exit(-1);
 98     }
 99     node->key = key, node->data = data;
100 
101     return node;
102 }
103 
104 /*-----------------------------------------------------------
105 |   node           right
106 |   / \    ==>     / \
107 |   a  right     node  y
108 |       / \           / \
109 |       b  y         a   b
110  -----------------------------------------------------------*/
111 static rb_node_t* rb_rotate_left(rb_node_t* node, rb_node_t* root)
112 {
113     rb_node_t* right = node->right;
114 
115     if ((node->right = right->left))
116     {
117         right->left->parent = node;
118     }
119     right->left = node;
120 
121     if ((right->parent = node->parent))
122     {
123         if (node == node->parent->right)
124         {
125             node->parent->right = right;
126         }
127         else
128         {
129             node->parent->left = right;
130         }
131     }
132     else
133     {
134         root = right;
135     }
136     node->parent = right;
137 
138     return root;
139 }
140 
141 /*-----------------------------------------------------------
142 |       node           left
143 |       / \            / \
144 |    left  y   ==>    a   node
145 |   / \               / \
146 |  a   b             b   y
147 -----------------------------------------------------------*/
148 static rb_node_t* rb_rotate_right(rb_node_t* node, rb_node_t* root)
149 {
150     rb_node_t* left = node->left;
151 
152     if ((node->left = left->right))
153     {
154         left->right->parent = node;
155     }
156     left->right = node;
157 
158     if ((left->parent = node->parent))
159     {
160         if (node == node->parent->right)
161         {
162             node->parent->right = left;
163         }
164         else
165         {
166             node->parent->left = left;
167         }
168     }
169     else
170     {
171         root = left;
172     }
173     node->parent = left;
174 
175     return root;
176 }
177 
178 static rb_node_t* rb_insert_rebalance(rb_node_t *node, rb_node_t *root)
179 {
180     rb_node_t *parent, *gparent, *uncle, *tmp;
181 
182     while ((parent = node->parent) && parent->color == RED)
183     {
184         gparent = parent->parent;
185 
186         if (parent == gparent->left)
187         {
188             uncle = gparent->right;
189             if (uncle && uncle->color == RED)
190             {
191                 uncle->color = BLACK;
192                 parent->color = BLACK;
193                 gparent->color = RED;
194                 node = gparent;
195             }
196             else
197             {
198                 if (parent->right == node)
199                 {
200                     root = rb_rotate_left(parent, root);
201                     tmp = parent;
202                     parent = node;
203                     node = tmp;
204                 }
205 
206                 parent->color = BLACK;
207                 gparent->color = RED;
208                 root = rb_rotate_right(gparent, root);
209             }
210         } 
211         else 
212         {
213             uncle = gparent->left;
214             if (uncle && uncle->color == RED)
215             {
216                 uncle->color = BLACK;
217                 parent->color = BLACK;
218                 gparent->color = RED;
219                 node = gparent;
220             }
221             else
222             {
223                 if (parent->left == node)
224                 {
225                     root = rb_rotate_right(parent, root);
226                     tmp = parent;
227                     parent = node;
228                     node = tmp;
229                 }
230 
231                 parent->color = BLACK;
232                 gparent->color = RED;
233                 root = rb_rotate_left(gparent, root);
234             }
235         }
236     }
237 
238     root->color = BLACK;
239 
240     return root;
241 }
242 
243 static rb_node_t* rb_erase_rebalance(rb_node_t *node, rb_node_t *parent, rb_node_t *root)
244 {
245     rb_node_t *other, *o_left, *o_right;
246 
247     while ((!node || node->color == BLACK) && node != root)
248     {
249         if (parent->left == node)
250         {
251             other = parent->right;
252             if (other->color == RED)
253             {
254                 other->color = BLACK;
255                 parent->color = RED;
256                 root = rb_rotate_left(parent, root);
257                 other = parent->right;
258             }
259             if ((!other->left || other->left->color == BLACK) &&
260                 (!other->right || other->right->color == BLACK))
261             {
262                 other->color = RED;
263                 node = parent;
264                 parent = node->parent;
265             }
266             else
267             {
268                 if (!other->right || other->right->color == BLACK)
269                 {
270                     if ((o_left = other->left))
271                     {
272                         o_left->color = BLACK;
273                     }
274                     other->color = RED;
275                     root = rb_rotate_right(other, root);
276                     other = parent->right;
277                 }
278                 other->color = parent->color;
279                 parent->color = BLACK;
280                 if (other->right)
281                 {
282                     other->right->color = BLACK;
283                 }
284                 root = rb_rotate_left(parent, root);
285                 node = root;
286                 break;
287             }
288         }
289         else
290         {
291             other = parent->left;
292             if (other->color == RED)
293             {
294                 other->color = BLACK;
295                 parent->color = RED;
296                 root = rb_rotate_right(parent, root);
297                 other = parent->left;
298             }
299             if ((!other->left || other->left->color == BLACK) &&
300                 (!other->right || other->right->color == BLACK))
301             {
302                 other->color = RED;
303                 node = parent;
304                 parent = node->parent;
305             }
306             else
307             {
308                 if (!other->left || other->left->color == BLACK)
309                 {
310                     if ((o_right = other->right))
311                     {
312                         o_right->color = BLACK;
313                     }
314                     other->color = RED;
315                     root = rb_rotate_left(other, root);
316                     other = parent->left;
317                 }
318                 other->color = parent->color;
319                 parent->color = BLACK;
320                 if (other->left)
321                 {
322                     other->left->color = BLACK;
323                 }
324                 root = rb_rotate_right(parent, root);
325                 node = root;
326                 break;
327             }
328         }
329     }
330 
331     if (node)
332     {
333         node->color = BLACK;
334     } 
335 
336     return root;
337 }
338 
339 static rb_node_t* rb_search_auxiliary(key_t key, rb_node_t* root, rb_node_t** save)
340 {
341     rb_node_t *node = root, *parent = NULL;
342     int ret;
343 
344     while (node)
345     {
346         parent = node;
347         ret = node->key - key;
348         if (0 < ret)
349         {
350             node = node->left;
351         }
352         else if (0 > ret)
353         {
354             node = node->right;
355         }
356         else
357         {
358             return node;
359         }
360     }
361 
362     if (save)
363     {
364         *save = parent;
365     }
366 
367     return NULL;
368 }
369 
370 rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root)
371 {
372     rb_node_t *parent = NULL, *node;
373 
374     parent = NULL;
375     if ((node = rb_search_auxiliary(key, root, &parent)))
376     {
377         return root;
378     }
379 
380     node = rb_new_node(key, data);
381     node->parent = parent; 
382     node->left = node->right = NULL;
383     node->color = RED;
384 
385     if (parent)
386     {
387         if (parent->key > key)
388         {
389             parent->left = node;
390         }
391         else
392         {
393             parent->right = node;
394         }
395     }
396     else
397     {
398         root = node;
399     }
400 
401     return rb_insert_rebalance(node, root);
402 }
403 
404 rb_node_t* rb_search(key_t key, rb_node_t* root)
405 {
406     return rb_search_auxiliary(key, root, NULL);
407 }
408 
409 rb_node_t* rb_erase(key_t key, rb_node_t *root)
410 {
411     rb_node_t *child, *parent, *old, *left, *node;
412     color_t color;
413 
414     if (!(node = rb_search_auxiliary(key, root, NULL)))
415     {
416         printf("key %d is not exist!\n");
417         return root;
418     }
419 
420     old = node;
421 
422     if (node->left && node->right)
423     {
424         node = node->right;
425         while ((left = node->left) != NULL)
426         {
427             node = left;
428         }
429         child = node->right;
430         parent = node->parent;
431         color = node->color;
432 
433         if (child)
434         {
435             child->parent = parent;
436         }
437         if (parent)
438         {
439             if (parent->left == node)
440             {
441                 parent->left = child;
442             }
443             else
444             {
445                 parent->right = child;
446             }
447         }
448         else
449         {
450             root = child;
451         }
452 
453         if (node->parent == old)
454         {
455             parent = node;
456         }
457 
458         node->parent = old->parent;
459         node->color = old->color;
460         node->right = old->right;
461         node->left = old->left;
462 
463         if (old->parent)
464         {
465             if (old->parent->left == old)
466             {
467                 old->parent->left = node;
468             }
469             else
470             {
471                 old->parent->right = node;
472             }
473         } 
474         else
475         {
476             root = node;
477         }
478 
479         old->left->parent = node;
480         if (old->right)
481         {
482             old->right->parent = node;
483         }
484     }
485     else
486     {
487         if (!node->left)
488         {
489             child = node->right;
490         }
491         else if (!node->right)
492         {
493             child = node->left;
494         }
495         parent = node->parent;
496         color = node->color;
497 
498         if (child)
499         {
500             child->parent = parent;
501         }
502         if (parent)
503         {
504             if (parent->left == node)
505             {
506                 parent->left = child;
507             }
508             else
509             {
510                 parent->right = child;
511             }
512         }
513         else
514         {
515             root = child;
516         }
517     }
518 
519     free(old);
520 
521     if (color == BLACK)
522     {
523         root = rb_erase_rebalance(child, parent, root);
524     }
525 
526     return root;
527 }

轉自:http://bbs.chinaunix.net/viewthread.php?tid=1308846&extra=page%3D1%26amp%3Bfilter%3Ddigest


posted on 2011-12-03 19:45 likun 閱讀(751) 評論(0)  編輯 收藏 引用 所屬分類: C/C++Algorithms
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合久久久久| 亚洲精一区二区三区| 久久国产一区| 亚洲一区二区在线播放| 亚洲一区二区三区激情| 一本久久综合亚洲鲁鲁| 亚洲视频第一页| 亚洲伊人久久综合| 久久成人一区| 欧美va亚洲va香蕉在线| 欧美精品在线观看91| 国产精品久久久久9999| 国产日韩综合| 亚洲日本中文字幕免费在线不卡| 一本色道久久综合一区| 欧美一级淫片播放口| 久久手机精品视频| 亚洲黄页一区| 亚洲视频欧美视频| 久久精品99| 欧美日韩国产综合视频在线观看| 国产精品一区二区三区久久| 亚洲国产成人av在线| 亚洲一区亚洲| 男女精品网站| 亚洲自拍都市欧美小说| 免费观看欧美在线视频的网站| 国产精品国产三级国产aⅴ入口| 韩国成人福利片在线播放| 日韩一区二区久久| 久久久999| 9久re热视频在线精品| 久久婷婷成人综合色| 国产精品你懂的在线| 亚洲精品一区二区三区四区高清 | 亚洲欧美怡红院| 欧美激情va永久在线播放| 亚洲精品久久久一区二区三区| 午夜一区在线| 欧美视频一区二区三区在线观看| 在线日韩中文| 久久黄色级2电影| 一区二区三区精品国产| 欧美国产另类| 亚洲成色www8888| 久久久久九九视频| 中国成人亚色综合网站| 欧美精品激情在线观看| 亚洲国产精品久久久久久女王| 久久福利电影| 午夜精品久久久久久久99黑人| 国产精品电影网站| 一本大道久久a久久综合婷婷| 免费视频最近日韩| 久久国产黑丝| 国产精品日韩在线播放| 亚洲欧美国产77777| 99国产精品久久久久久久| 欧美精品在线一区二区| 999在线观看精品免费不卡网站| 免费亚洲视频| 久久免费视频网| 在线看欧美视频| 男人插女人欧美| 欧美v日韩v国产v| 亚洲美女av网站| 日韩视频免费观看高清在线视频| 欧美日韩美女在线观看| 亚洲天堂av高清| 亚洲一区二区三区在线播放| 国产精品日韩一区二区三区| 久久久久久夜| 美女国内精品自产拍在线播放| 亚洲精品黄网在线观看| 99精品国产高清一区二区| 国产精品老女人精品视频| 久久福利毛片| 久久在线视频| 亚洲最新在线视频| 宅男精品导航| 国产在线拍揄自揄视频不卡99| 久久午夜精品一区二区| 玖玖玖免费嫩草在线影院一区| 亚洲精品字幕| 亚洲免费网站| 亚洲国产日韩精品| 一区二区三区精品久久久| 国产综合色在线视频区| 亚洲国产精品精华液2区45| 欧美日韩视频| 久久一区二区视频| 欧美日韩高清在线播放| 久久成人人人人精品欧| 牛夜精品久久久久久久99黑人| 亚洲一区欧美| 久久在线91| 午夜精彩国产免费不卡不顿大片| 久久精品中文| 亚洲伊人久久综合| 欧美成人首页| 国产精品毛片a∨一区二区三区| 久久天天躁夜夜躁狠狠躁2022| 欧美成年人网站| 欧美一区二区三区视频在线| 美女啪啪无遮挡免费久久网站| 亚洲在线播放| 欧美激情小视频| 久久久人成影片一区二区三区观看| 欧美激情国产日韩精品一区18| 欧美一级黄色录像| 欧美巨乳波霸| 欧美成人精品一区二区三区| 国产精品主播| 一本一本久久a久久精品综合妖精| 影音先锋日韩有码| 午夜欧美大片免费观看| 亚洲午夜av电影| 欧美华人在线视频| 欧美插天视频在线播放| 国产有码在线一区二区视频| 亚洲亚洲精品在线观看| 99国产一区二区三精品乱码| 蜜桃av一区二区| 欧美电影在线播放| 在线观看一区视频| 久久精品国产久精国产一老狼| 欧美亚洲一区三区| 国产精品久久久久婷婷| av成人黄色| 亚洲综合精品一区二区| 欧美日韩在线精品一区二区三区| 亚洲国产一区二区a毛片| 亚洲国产精品视频| 久久综合五月| 欧美福利精品| 亚洲精品美女在线观看| 欧美大片在线看| 亚洲三级性片| 中日韩午夜理伦电影免费| 欧美理论电影在线观看| 日韩视频免费观看高清在线视频| 一本久道久久久| 欧美午夜精品久久久久久孕妇| 日韩午夜免费| 午夜激情综合网| 国内外成人免费激情在线视频| 久久久亚洲国产美女国产盗摄| 免费一级欧美片在线播放| 亚洲电影免费观看高清完整版在线观看| 久久精品国产免费看久久精品| 免费观看在线综合| 亚洲美女在线视频| 欧美性猛交99久久久久99按摩 | 另类春色校园亚洲| 伊人成人在线视频| 欧美大胆成人| 亚洲另类视频| 香蕉精品999视频一区二区| 国产字幕视频一区二区| 玖玖国产精品视频| 一区二区三区四区五区视频| 久久国产精品一区二区三区四区 | 久久国产精品一区二区| 老鸭窝毛片一区二区三区| 欧美岛国在线观看| 国产精品99久久久久久www| 久久精品视频网| 亚洲区第一页| 国产精品日韩在线观看| 美国十次成人| 中文日韩在线| 欧美大片在线影院| 欧美亚洲日本一区| 亚洲黄色成人| 国产精品网红福利| 蜜臀91精品一区二区三区| 中文网丁香综合网| 欧美高清在线播放| 香蕉视频成人在线观看| 亚洲欧洲精品一区| 国产免费观看久久| 欧美日产国产成人免费图片| 欧美一区二区在线免费观看| 91久久久久久久久久久久久| 欧美在线播放一区二区| 日韩视频免费在线| 韩国一区二区三区在线观看 | 欧美r片在线| 欧美专区福利在线| 99在线|亚洲一区二区| 欧美成人午夜影院| 久久精品首页| 香蕉成人久久| 亚洲午夜激情在线| 亚洲国产日韩综合一区| 国产亚洲欧洲一区高清在线观看| 欧美日韩一区二区三区在线看| 久久字幕精品一区| 久久国产精品久久久久久| 亚洲欧美中文另类|