• <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>
            隨筆 - 70  文章 - 160  trackbacks - 0

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

            常用鏈接

            留言簿(8)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 178996
            • 排名 - 147

            最新評論

            閱讀排行榜

            評論排行榜

            建議先看看前言:http://www.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 閱讀(2028) 評論(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
              回復  更多評論
              
            性做久久久久久久久浪潮| 人妻精品久久无码区| 久久精品一区二区三区AV| 国产精品免费久久| 国产精品久久亚洲不卡动漫| 成人久久精品一区二区三区| 色诱久久久久综合网ywww| 中文字幕无码av激情不卡久久| 久久久久国产| 亚洲精品国产综合久久一线| 久久强奷乱码老熟女网站| 狠狠色丁香婷婷久久综合| 色综合久久综合中文综合网| 秋霞久久国产精品电影院| 久久综合九色综合久99| 久久精品国产99久久香蕉| 久久久WWW成人免费精品| 久久久久久A亚洲欧洲AV冫| 四虎亚洲国产成人久久精品| 亚洲αv久久久噜噜噜噜噜| 无码国内精品久久人妻| 91精品国产高清91久久久久久| 国产精品视频久久| 国产成人精品久久亚洲高清不卡 | 久久99精品久久久久久噜噜| 三上悠亚久久精品| 久久99热狠狠色精品一区| 狠狠综合久久AV一区二区三区| 亚洲国产天堂久久综合网站 | 四虎国产精品成人免费久久| 亚洲国产成人久久一区WWW| 亚洲精品乱码久久久久久久久久久久 | 精品国产一区二区三区久久久狼| 久久久久国产精品麻豆AR影院| 日韩久久无码免费毛片软件| 亚洲人成精品久久久久| 国产香蕉久久精品综合网| 韩国免费A级毛片久久| 99久久综合狠狠综合久久| 精品国产乱码久久久久久人妻| 久久青草国产手机看片福利盒子|