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

隨筆 - 70  文章 - 160  trackbacks - 0

公告:
知識共享許可協議
本博客采用知識共享署名 2.5 中國大陸許可協議進行許可。本博客版權歸作者所有,歡迎轉載,但未經作者同意不得隨機刪除文章任何內容,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 具體操作方式可參考此處。如您有任何疑問或者授權方面的協商,請給我留言。

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

積分與排名

  • 積分 - 180164
  • 排名 - 147

最新評論

閱讀排行榜

評論排行榜

建議先看看前言:http://m.shnenglu.com/tanky-woo/archive/2011/04/09/143794.html

這一章把前面三篇的代碼總結起來,然后推薦一些網上紅黑樹的優秀講解資源。

代碼:

1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            26
            27
            28
            29
            30
            31
            32
            33
            34
            35
            36
            37
            38
            39
            40
            41
            42
            43
            44
            45
            46
            47
            48
            49
            50
            51
            52
            53
            54
            55
            56
            57
            58
            59
            60
            61
            62
            63
            64
            65
            66
            67
            68
            69
            70
            71
            72
            73
            74
            75
            76
            77
            78
            79
            80
            81
            82
            83
            84
            85
            86
            87
            88
            89
            90
            91
            92
            93
            94
            95
            96
            97
            98
            99
            100
            101
            102
            103
            104
            105
            106
            107
            108
            109
            110
            111
            112
            113
            114
            115
            116
            117
            118
            119
            120
            121
            122
            123
            124
            125
            126
            127
            128
            129
            130
            131
            132
            133
            134
            135
            136
            137
            138
            139
            140
            141
            142
            143
            144
            145
            146
            147
            148
            149
            150
            151
            152
            153
            154
            155
            156
            157
            158
            159
            160
            161
            162
            163
            164
            165
            166
            167
            168
            169
            170
            171
            172
            173
            174
            175
            176
            177
            178
            179
            180
            181
            182
            183
            184
            185
            186
            187
            188
            189
            190
            191
            192
            193
            194
            195
            196
            197
            198
            199
            200
            201
            202
            203
            204
            205
            206
            207
            208
            209
            210
            211
            212
            213
            214
            215
            216
            217
            218
            219
            220
            221
            222
            223
            224
            225
            226
            227
            228
            229
            230
            231
            232
            233
            234
            235
            236
            237
            238
            239
            240
            241
            242
            243
            244
            245
            246
            247
            248
            249
            250
            251
            252
            253
            254
            255
            256
            257
            258
            259
            260
            261
            262
            263
            264
            265
            266
            267
            268
            269
            270
            271
            272
            273
            274
            275
            276
            277
            278
            279
            280
            281
            282
            283
            284
            285
            286
            287
            288
            289
            290
            291
            292
            293
            294
            295
            296
            297
            298
            299
            300
            301
            302
            303
            304
            305
            306
            307
            308
            309
            310
            311
            312
            313
            314
            315
            316
            317
            318
            319
            320
            321
            322
            323
            324
            325
            326
            327
            328
            329
            330
            331
            332
            333
            334
            335
            336
            337
            338
            339
            340
            341
            342
            343
            344
            345
            346
            347
            348
            349
            350
            351
            352
            353
            354
            355
            356
            357
            358
            359
            360
            361
            362
            363
            364
            365
            366
            367
            368
            369
            370
            371
            372
            373
            374
            375
            376
            377
            378
            379
            380
            381
            382
            383
            384
            385
            386
            387
            388
            389
            390
            391
            392
            393
            
/*
            * Author: Tanky Woo
            * Blog:   www.WuTianQi.com
            * Description: 《算法導論》第13章 Red Black Tree
            */
            #include <iostream>
            //#define NULL 0
            using namespace std;
             
            const int RED = 0;
            const int BLACK = 1;
             
            // ①
            typedef struct Node{
            int color;
            int key;
            Node *lchild, *rchild, *parent;
            }Node, *RBTree;
             
            static Node NIL = {BLACK, 0, 0, 0, 0};
             
            #define NULL (&NIL)
             
            // ②
            Node * RBTreeSearch(RBTree T, int k)
            {
            if(T == NULL || k == T->key)
            return T;
            if(k < T->key)
            return RBTreeSearch(T->lchild, k);
            else
            return RBTreeSearch(T->rchild, k);
            }
             
            /*
             
            BSNode * IterativeRBTreeSearch(RBTree T, int k)
            {
            while(T != NULL && k != T->key)
            {
            if(k < T->lchild->key);
            x = T->lchild;
            else
            x = T->rchild;
            }
            return x;
            }
            */
             
            // ③
            Node * RBTreeMinimum(RBTree T)
            {
            while(T->lchild != NULL)
            T = T->lchild;
            return T;
            }
             
            Node * RBTreeMaximum(RBTree T)
            {
            while(T->rchild != NULL)
            T = T->rchild;
            return T;
            }
             
            // ④
            Node *RBTreeSuccessor(Node *x)
            {
            if(x->rchild != NULL)
            return RBTreeMinimum(x->rchild);
            Node *y = x->parent;
            while(y != NULL && x == y->rchild)
            {
            x = y;
            y = y->parent;
            }
            return y;
            }
             
            void LeftRotate(RBTree &T, Node *x)
            {
            Node *y = x->rchild;
            x->rchild = y->lchild;
            if(y->lchild != NULL)
            y->lchild->parent = x;
            y->parent = x->parent;
            if(x->parent == NULL)
            T = y;
            else
            {
            if(x == x->parent->lchild)
            x->parent->lchild = y;
            else
            x->parent->rchild = y;
            }
            y->lchild = x;
            x->parent = y;
            }
             
            void RightRotate(RBTree &T, Node *x)
            {
            Node *y = x->rchild;
            x->rchild = y->lchild;
            if(y->lchild != NULL)
            y->lchild->parent = x;
            y->parent = x->parent;
            if(x->parent == NULL)
            T = y;
            else
            {
            if(x == x->parent->lchild)
            x->parent->lchild = y;
            else
            x->parent->rchild = y;
            }
            y->lchild = x;
            x->parent = y;
            }
             
            // ⑤
            void RBInsertFixup(RBTree &T, Node *z)
            {
            while(z->parent->color == RED)
            {
            if(z->parent == z->parent->parent->lchild)
            {
            Node *y = z->parent->parent->rchild;
            //////////// Case1 //////////////
            if(y->color == RED)
            {
            z->parent->color = BLACK;
            y->color = BLACK;
            z->parent->parent->color = RED;
            z = z->parent->parent;
            }
            else
            {
            ////////////// Case 2 //////////////
            if(z == z->parent->rchild)
            {
            z = z->parent;
            LeftRotate(T, z);
            }
            ////////////// Case 3 //////////////
            z->parent->color = BLACK;
            z->parent->parent->color = RED;
            RightRotate(T, z->parent->parent);
            }
            }
            else
            {
            Node *y = z->parent->parent->lchild;
            if(y->color == RED)
            {
            z->parent->color = BLACK;
            y->color = BLACK;
            z->parent->parent->color = RED;
            z = z->parent->parent;
            }
            else
            {
            if(z == z->parent->lchild)
            {
            z = z->parent;
            RightRotate(T, z);
            }
            z->parent->color = BLACK;
            z->parent->parent->color = RED;
            LeftRotate(T, z->parent->parent);
            }
            }
            }
            T->color = BLACK;
            }
             
            void RBTreeInsert(RBTree &T, int k)
            {
            //T->parent->color = BLACK;
            Node *y = NULL;
            Node *x = T;
            Node *z = new Node;
            z->key = k;
            z->lchild = z->parent = z->rchild = NULL;
             
            while(x != NULL)
            {
            y = x;
             
            if(k < x->key)
            x = x->lchild;
            else
            x = x->rchild;
            }
             
            z->parent = y;
            if(y == NULL)
            {
            T = z;
            T->parent = NULL;
            T->parent->color = BLACK;
            }
            else
            if(k < y->key)
            y->lchild = z;
            else
            y->rchild = z;
            z->lchild = NULL;
            z->rchild = NULL;
            z->color = RED;
            RBInsertFixup(T, z);
            }
             
             
             
            // ⑤
            void RBDeleteFixup(RBTree &T, Node *x)
            {
            while(x != T && x->color == BLACK)
            {
            if(x == x->parent->lchild)
            {
            Node *w = x->parent->rchild;
            ///////////// Case 1 /////////////
            if(w->color == RED)
            {
            w->color = BLACK;
            x->parent->color = RED;
            LeftRotate(T, x->parent);
            w = x->parent->rchild;
            }
            ///////////// Case 2 /////////////
            if(w->lchild->color == BLACK && w->rchild->color == BLACK)
            {
            w->color = RED;
            x = x->parent;
            }
            else
            {
            ///////////// Case 3 /////////////
            if(w->rchild->color == BLACK)
            {
            w->lchild->color = BLACK;
            w->color = RED;
            RightRotate(T, w);
            w = x->parent->rchild;
            }
            ///////////// Case 4 /////////////
            w->color = x->parent->color;
            x->parent->color = BLACK;
            w->rchild->color = BLACK;
            LeftRotate(T, x->parent);
            x = T;
            }
            }
            else
            {
            Node *w = x->parent->lchild;
            if(w->color == RED)
            {
            w->color = BLACK;
            x->parent->color = RED;
            RightRotate(T, x->parent);
            w = x->parent->lchild;
            }
            if(w->lchild->color == BLACK && w->rchild->color == BLACK)
            {
            w->color = RED;
            x = x->parent;
            }
            else
            {
            if(w->lchild->color == BLACK)
            {
            w->rchild->color = BLACK;
            w->color = RED;
            LeftRotate(T, w);
            w = x->parent->lchild;
            }
            w->color = x->parent->color;
            x->parent->color = BLACK;
            w->lchild->color = BLACK;
            RightRotate(T, x->parent);
            x = T;
            }
            }
            }
            x->color = BLACK;
            }
             
            Node* RBTreeDelete(RBTree T, Node *z)
            {
            Node *x, *y;
            // z是要刪除的節點,而y是要替換z的節點
            if(z->lchild == NULL || z->rchild == NULL)
            y = z;   // 當要刪除的z至多有一個子樹,則y=z;
            else
            y = RBTreeSuccessor(z);  // y是z的后繼
            if(y->lchild != NULL)
            x = y->lchild;
            else
            x = y->rchild;
            // 無條件執行p[x] = p[y]
            x->parent = y->parent;  //如果y至多只有一個子樹,則使y的子樹成為y的父親節點的子樹
            if(y->parent == NULL)   // 如果y沒有父親節點,則表示y是根節點,詞典其子樹x為根節點
            T = x;
            else if(y == y->parent->lchild)
            // 如果y是其父親節點的左子樹,則y的子樹x成為其父親節點的左子樹,
            // 否則成為右子樹
            y->parent->lchild = x;
            else
            y->parent->rchild = x;
            if(y != z)
            z->key = y->key;
            if(y->color == BLACK)
            RBDeleteFixup(T, x);
            return y;
            }
             
            void InRBTree(RBTree T)
            {
            if(T != NULL)
            {
            InRBTree(T->lchild);
            cout << T->key << " ";
            InRBTree(T->rchild);
            }
            }
             
            void PrintRBTree(RBTree T)
            {
            if(T != NULL)
            {
            PrintRBTree(T->lchild);
            cout << T->key << ": ";
            // 自身的顏色
            if(T->color == 0)
            cout << " Color: RED ";
            else
            cout << " Color: BLACK ";
             
            // 父親結點的顏色
            if(T == NULL)
            cout << " Parent: BLACK ";
            else
            {
            if(T->color == 0)
            cout << " Parent: RED ";
            else
            cout << " Parent: BLACK ";
            }
             
            // 左兒子結點的顏色
            if(T->lchild == NULL)
            cout << " Lchild: BLACK ";
            else
            {
            if(T->lchild->color == 0)
            cout << " Lchild: RED ";
            else
            cout << " Lchild: BLACK ";
            }
             
            // 右兒子結點的顏色
            if(T->rchild == NULL)
            cout << " Rchild: BLACK ";
            else
            {
            if(T->rchild->color == 0)
            cout << " Rchild: RED ";
            else
            cout << " Rchild: BLACK ";
            }
            cout << endl;
            PrintRBTree(T->rchild);
            }
            }
             
            int main()
            {
            int m;
            RBTree T = NULL;
            for(int i=0; i<9; ++i)
            {
            cin >> m;
            RBTreeInsert(T, m);
            cout << "在紅黑樹中序查找:";
            InRBTree(T);
            cout << endl;
            }
            PrintRBTree(T);
            cout << "刪除根節點后:";
            RBTreeDelete(T, T);
            InRBTree(T);
            }

截圖如圖:

rbt4

如圖顯示,這里用到了書上圖13-4.可以看到,結點1, 5, 7, 8, 14是黑結點.和圖13-4顯示一樣.

另外,我在學習紅黑樹的過程中,在網上發現了幾個不錯的資料,這里給大家推薦下:

天枰座的唐風朋友的:

http://liyiwen.iteye.com/blog/345800

http://liyiwen.iteye.com/blog/345799

wangdei的紅黑樹算法,附AVL樹的比較:

http://wangdei.iteye.com/blog/236157

July的紅黑樹算法層層剖析與逐步實現:

1、教你透徹了解紅黑樹
2、紅黑樹算法的實現與剖析
3、紅黑樹的c源碼實現與剖析
4、一步一圖一代碼,R-B Tree
5、紅黑樹插入和刪除結點的全程演示
6、紅黑樹的c++完整實現源碼


感謝上面的朋友寫的這么好的分析文章。

在我獨立博客上的原文:http://www.wutianqi.com/?p=2473

歡迎大家互相學習,互相進步!

posted on 2011-05-12 16:33 Tanky Woo 閱讀(2049) 評論(1)  編輯 收藏 引用

FeedBack:
# re: 《算法導論》學習總結 — 15. 第13章 紅黑樹(4) 2011-05-16 16:25 ray ban
Write well, support you to move on and look forward to your next article.
This article is really great, strong support
  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美性猛交xxxx乱大交蜜桃 | 亚洲精品男同| 欧美日韩第一区日日骚| 久久国产主播精品| 国产精品99久久久久久久久久久久| 欧美一区二区三区视频在线 | 99综合精品| 99视频精品免费观看| 一本久久a久久免费精品不卡| 亚洲国产合集| 一区二区不卡在线视频 午夜欧美不卡'| 久久成人国产| 欧美国产第二页| 亚洲国产欧美久久| 91久久精品国产91久久| 亚洲乱码一区二区| 亚洲一区二区三区成人在线视频精品 | 亚洲黄色高清| 亚洲免费在线播放| 牛夜精品久久久久久久99黑人 | 亚洲欧美日韩国产| 久久国产99| 欧美极品aⅴ影院| 国产精品国产自产拍高清av| 国产亚洲第一区| 亚洲国产成人精品女人久久久| 狠狠久久五月精品中文字幕| 精品成人在线观看| 午夜精品久久久| 亚洲人午夜精品免费| 欧美在线一区二区| 国产精品日韩欧美| 一区二区国产在线观看| 免费久久精品视频| 亚洲欧美日韩一区二区| 欧美日韩高清区| 亚洲国产美女精品久久久久∴| 性做久久久久久久免费看| 狠色狠色综合久久| 欧美另类在线播放| 伊人一区二区三区久久精品| 亚洲精选在线| 亚洲国产精品ⅴa在线观看| 欧美一区精品| 国产亚洲欧美日韩一区二区| 欧美在线精品免播放器视频| 亚洲网站在线看| 国产精品拍天天在线| 欧美在线播放视频| 欧美一级久久久| 国产亚洲一本大道中文在线| 久久久水蜜桃| 免费短视频成人日韩| 亚洲人成人一区二区在线观看| 欧美99在线视频观看| 蜜桃久久av一区| 一区二区免费看| 欧美在线观看日本一区| 亚洲激情黄色| 亚洲女优在线| 亚洲美女中文字幕| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 一本久道久久综合婷婷鲸鱼| 亚洲精品偷拍| 红桃视频国产一区| 亚洲特色特黄| 亚洲三级免费电影| 久久高清免费观看| 亚洲欧美一区二区三区在线| 免费成人毛片| 亚洲自拍三区| 亚洲乱码国产乱码精品精天堂 | 亚洲高清视频在线| 国模精品一区二区三区| aa国产精品| 最新高清无码专区| 久久天堂av综合合色| 欧美区高清在线| 亚洲午夜精品17c| 欧美大片免费观看| 免费视频一区| 亚洲伦理中文字幕| 欧美精品国产| 亚洲一区二区欧美日韩| 午夜精品一区二区三区在线播放 | 亚洲免费影视第一页| 欧美aⅴ一区二区三区视频| 久久天天狠狠| 亚洲国产一区二区精品专区| 美女脱光内衣内裤视频久久影院| 欧美成人日韩| 亚洲特级毛片| 国产一区二区福利| 欧美a级在线| 亚洲网站在线观看| 免费黄网站欧美| 艳妇臀荡乳欲伦亚洲一区| 欧美午夜一区二区福利视频| 亚洲欧美日韩国产中文在线| 老色批av在线精品| 亚洲女人天堂成人av在线| 国外成人网址| 欧美日韩一区二区三区四区在线观看| 一区二区三区视频在线看| 国产精品青草久久| 另类综合日韩欧美亚洲| 9色精品在线| 亚洲国产女人aaa毛片在线| 亚洲天堂成人在线视频| 狠狠久久亚洲欧美专区| 欧美日韩直播| 欧美视频观看一区| 欧美日本在线播放| 欧美国产精品va在线观看| 欧美自拍丝袜亚洲| 久久精品72免费观看| 翔田千里一区二区| 亚洲午夜av在线| 亚洲女同同性videoxma| 中文高清一区| 午夜精品电影| 一区二区三区四区五区精品| av不卡在线观看| 亚洲欧美日韩一区二区在线| 亚洲午夜羞羞片| 亚洲一区三区电影在线观看| 一区二区三区成人| 亚洲视频在线一区| 亚洲欧美日韩一区在线观看| 国产一级精品aaaaa看| 国产一区二区观看| 亚洲国产精品va| 夜夜狂射影院欧美极品| 欧美成人资源| 麻豆免费精品视频| 亚洲精品色图| 久久午夜羞羞影院免费观看| 裸体女人亚洲精品一区| 欧美日韩精品免费观看视频完整 | 久久精品一区四区| 欧美福利一区二区三区| 国产精品国产三级国产专播精品人| 亚洲黄色视屏| 欧美一区二区视频在线| 欧美成人乱码一区二区三区| 国产精品多人| 9色国产精品| 免费视频一区| 性欧美xxxx视频在线观看| 欧美aⅴ99久久黑人专区| 国产精品天天看| 亚洲一区三区电影在线观看| 欧美激情第二页| 久久久水蜜桃| 一色屋精品视频在线观看网站| 亚洲一区二区三区免费观看| 免费久久99精品国产自在现线| 亚洲午夜激情在线| 国产精品久久久久久久免费软件 | 欧美激情导航| 久久久国产成人精品| 国产在线拍偷自揄拍精品| 久久福利毛片| 美女视频黄a大片欧美| 伊人久久久大香线蕉综合直播 | 9l国产精品久久久久麻豆| 欧美成人蜜桃| 欧美jizzhd精品欧美喷水| 亚洲黄色片网站| 日韩视频在线永久播放| 国产精品色在线| 蜜桃av综合| 欧美视频免费看| 欧美成人精品在线| 欧美午夜不卡在线观看免费| 中文av字幕一区| 亚洲女同性videos| 亚洲永久免费观看| 在线观看91精品国产入口| 狠狠色综合日日| 亚洲精品日产精品乱码不卡| 欧美日韩精品免费观看| 久久综合中文字幕| 国产精品美腿一区在线看| 欧美激情综合| 国产日韩av一区二区| 亚洲毛片av| 亚洲第一精品久久忘忧草社区| 一区二区三区日韩在线观看| 一区二区三区在线免费观看| 亚洲三级观看| 日韩一级精品视频在线观看| 欧美在线观看天堂一区二区三区| 一本综合久久| 欧美日韩免费视频| 夜夜嗨av一区二区三区四区| 9久re热视频在线精品| 欧美好吊妞视频| 欧美1区视频| 日韩一级片网址|