• <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)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 179335
            • 排名 - 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 閱讀(2032) 評論(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
              回復  更多評論
              
            99久久国产综合精品麻豆| 久久夜色精品国产www| 亚洲中文字幕久久精品无码喷水| 人妻无码精品久久亚瑟影视| 无码人妻久久一区二区三区蜜桃| 人妻无码αv中文字幕久久| 9久久9久久精品| 日本久久久久久久久久| 亚洲av成人无码久久精品| 99久久免费国产特黄| 久久久久久A亚洲欧洲AV冫| 无码超乳爆乳中文字幕久久| 久久综合九色综合久99| 老男人久久青草av高清| 青青草原综合久久| 久久精品亚洲一区二区三区浴池| 精品免费久久久久国产一区| 久久婷婷五月综合色高清 | 久久精品三级视频| 人妻精品久久久久中文字幕69| 99久久精品国产一区二区| 久久人人爽人人爽人人片AV不 | 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 中文字幕乱码久久午夜| 久久国产成人午夜aⅴ影院| 久久久久亚洲AV片无码下载蜜桃 | 国产99久久九九精品无码| 久久综合给合久久狠狠狠97色| 欧美一级久久久久久久大| 97精品国产97久久久久久免费| 久久A级毛片免费观看| 无码人妻久久一区二区三区| 欧美亚洲国产精品久久高清 | 久久男人AV资源网站| 久久96国产精品久久久| 国内精品久久国产大陆| 久久99国产综合精品| 国产成人综合久久综合| 国产精品久久久久9999| 丁香狠狠色婷婷久久综合| 久久综合久久综合九色|