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

隨筆 - 70  文章 - 160  trackbacks - 0

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

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

積分與排名

  • 積分 - 180440
  • 排名 - 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
  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美一区二区视频在线观看2020| 一区国产精品| 亚洲综合激情| 亚洲一区国产精品| 午夜激情久久久| 久久久久久久久久久成人| 欧美在线观看一区二区| 久久―日本道色综合久久| 免费看亚洲片| 欧美日韩一区二区国产| 国产精品嫩草影院av蜜臀| 国产女优一区| 亚洲国产天堂久久综合网| 一本久久精品一区二区| 午夜精品一区二区三区电影天堂| 久久久999成人| 亚洲韩国精品一区| 久久99在线观看| 欧美资源在线| 久久偷看各类wc女厕嘘嘘偷窃| 久久一区二区三区四区五区| 欧美久久久久久久久| 国产精品日韩专区| 在线观看日韩精品| 亚洲欧美美女| 亚洲激情视频在线观看| 亚洲永久免费av| 免费看的黄色欧美网站| 国产精品免费久久久久久| 亚洲第一网站| 欧美一区二区三区日韩| 最新亚洲一区| 午夜久久影院| 欧美日韩不卡视频| 一区二区三区在线高清| 亚洲字幕一区二区| 亚洲激情成人在线| 久久精品免费播放| 欧美日韩精品免费观看视频| 在线观看亚洲精品| 亚洲综合首页| 亚洲精品一区二区三区婷婷月 | 国产精品人成在线观看免费| 在线日韩欧美| 久久综合激情| 欧美一区二区视频在线| 欧美午夜激情视频| 99精品国产在热久久婷婷| 久久亚洲色图| 欧美一级日韩一级| 国产精品日韩在线一区| 亚洲网站在线观看| 最新亚洲一区| 欧美人妖另类| 夜夜爽www精品| 99精品免费| 欧美日韩国产小视频| 亚洲人午夜精品| 亚洲动漫精品| 欧美大片在线看免费观看| 国内久久精品视频| 久久精品二区| 亚洲欧美日韩综合| 国产视频欧美视频| 乱码第一页成人| 麻豆91精品| 日韩网站免费观看| 亚洲精品一区二区三区蜜桃久 | 亚洲性视频网站| 激情文学一区| 国产亚洲一区在线| 久久都是精品| 久久精品av麻豆的观看方式| 国产视频不卡| 免费一级欧美片在线播放| 老司机成人在线视频| 亚洲国产一区二区精品专区| 欧美激情影音先锋| 欧美日韩亚洲另类| 欧美一区二区三区视频在线观看 | 一本色道久久综合亚洲精品不| 欧美日本一道本在线视频| av成人激情| 亚洲综合日韩中文字幕v在线| 国产日韩精品一区二区三区| 久久久精品一区二区三区| 久久久无码精品亚洲日韩按摩| 一区二区视频欧美| 亚洲国产精品成人一区二区| 欧美日韩精品一区二区三区| 欧美一区日韩一区| 美女主播视频一区| 夜夜夜久久久| 亚欧成人在线| 99亚洲一区二区| 亚洲欧美怡红院| 亚洲精品国产系列| 亚洲一本视频| 亚洲国产人成综合网站| 亚洲视频在线二区| 亚洲黄一区二区三区| 亚洲综合国产激情另类一区| 在线国产亚洲欧美| 亚洲精品在线观看视频| 韩国精品久久久999| 99亚洲一区二区| 一区视频在线看| 亚洲淫片在线视频| 91久久久久久久久久久久久| 亚洲一区二区视频在线| 日韩午夜激情| 欧美69wwwcom| 麻豆精品网站| 国产一区二区av| 亚洲视频免费观看| 99视频在线观看一区三区| 久久综合狠狠综合久久综合88| 性18欧美另类| 国产精品二区影院| 亚洲精品在线免费| 亚洲激情专区| 开心色5月久久精品| 久久午夜色播影院免费高清| 国产精自产拍久久久久久蜜| 一区二区日韩欧美| 中文精品视频| 欧美日韩免费观看中文| 亚洲国产日韩欧美一区二区三区| 精品不卡视频| 久久精品亚洲精品| 久久久久久久国产| 国内精品久久久久久久影视麻豆| 美日韩精品免费| 亚洲卡通欧美制服中文| 亚洲精美视频| 久久视频在线视频| 久久婷婷综合激情| 黄色av成人| 久久久久久久波多野高潮日日 | 亚洲影院免费观看| 欧美色视频在线| 亚洲视频每日更新| 欧美伊久线香蕉线新在线| 国产精品色一区二区三区| 一本大道久久精品懂色aⅴ| 亚洲天堂成人在线观看| 国产精品久久999| 午夜精品久久久久久久99樱桃 | 蜜臀av一级做a爰片久久| 美女性感视频久久久| 在线看无码的免费网站| 久久综合伊人77777| 亚洲国产欧美国产综合一区| 日韩一级大片在线| 欧美日韩中文字幕在线视频| 亚洲在线观看免费| 久热精品视频| 亚洲欧洲精品一区二区三区| 欧美日韩国产在线| 午夜久久电影网| 亚洲高清视频在线| 亚洲一本大道在线| 国产亚洲午夜| 欧美激情精品久久久久久大尺度| 日韩午夜激情| 久久久久久久久久久久久9999| 亚洲第一色在线| 国产精品久久久久久亚洲调教| 性色av一区二区三区| 欧美激情第4页| 亚洲欧美电影在线观看| 黄色日韩精品| 欧美日韩免费在线| 久久精品国产亚洲a| 亚洲精品日韩欧美| 久久视频在线免费观看| 亚洲天堂黄色| 亚洲国产精品久久久| 国产精品成人v| 裸体丰满少妇做受久久99精品| 亚洲视频在线观看三级| 榴莲视频成人在线观看| 亚洲素人在线| 亚洲国产美女| 韩国一区二区三区在线观看| 欧美日韩亚洲一区二区三区在线观看 | 欧美午夜精品久久久久久孕妇| 久久成人国产| 亚洲午夜电影| 亚洲经典在线看| 欧美不卡一卡二卡免费版| 欧美在线视频免费| 亚洲免费视频一区二区| 亚洲精品免费一二三区| 欧美一区二区视频观看视频| 91久久黄色| 黄色成人小视频| 国产精品视频福利| 欧美精品一区三区| 久久亚洲欧洲|