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

隨筆 - 70  文章 - 160  trackbacks - 0

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

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

積分與排名

  • 積分 - 180816
  • 排名 - 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 閱讀(2053) 評論(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>
              欧美午夜精品理论片a级按摩| 欧美性做爰毛片| 亚洲国产成人精品久久| 在线看片成人| 亚洲午夜黄色| 亚洲视频一区| 国产啪精品视频| 久久夜色精品国产噜噜av| 欧美在线日韩| 亚洲福利视频网站| 午夜精品成人在线视频| 亚洲欧美日韩在线一区| 国产亚洲欧美一区在线观看| 美女爽到呻吟久久久久| 在线视频中文亚洲| 女人色偷偷aa久久天堂| 夜夜嗨av色综合久久久综合网| 久久九九精品| 一本久久综合| 国产亚洲视频在线观看| 欧美福利一区二区三区| 欧美日韩一区免费| 久久久999成人| 欧美日本不卡高清| 性欧美激情精品| av成人免费在线观看| 欧美激情精品久久久久久变态| 国内精品久久久久久影视8| 麻豆av福利av久久av| 欧美理论电影在线播放| 久久精品日韩一区二区三区| 欧美精品亚洲二区| 亚洲激情av在线| 亚洲天堂黄色| 亚洲精品久久久久久久久| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 99精品黄色片免费大全| 午夜精彩视频在线观看不卡| 国产精品theporn| 欧美/亚洲一区| 国产美女精品视频| 日韩一区二区电影网| 欧美日韩一区在线| 女女同性精品视频| 美女主播一区| 久久九九精品99国产精品| 欧美一区二区福利在线| 国产自产2019最新不卡| 日韩视频精品| 91久久精品一区二区别| 欧美一区在线看| 亚洲欧美另类中文字幕| 欧美大片在线看免费观看| 老司机午夜精品视频在线观看| 国产精品一区免费观看| 宅男在线国产精品| 在线一区亚洲| 欧美日本免费| 香蕉久久一区二区不卡无毒影院 | 久久免费少妇高潮久久精品99| 在线成人欧美| 午夜在线精品偷拍| 午夜日韩在线观看| 欧美视频免费在线观看| 亚洲精品视频一区| 国产精品性做久久久久久| 99国内精品久久| 亚洲午夜精品17c| 国产精品久久二区| 亚洲天堂av高清| 亚洲国产精品精华液2区45| 久久裸体视频| 欧美电影在线播放| 亚洲第一搞黄网站| 蜜桃伊人久久| 亚洲国产成人精品视频| 99re6热只有精品免费观看| 亚洲一区在线播放| 午夜久久tv| 国产一区二区av| 麻豆91精品91久久久的内涵| 亚洲欧美在线免费| 国产精品有限公司| 欧美在线影院在线视频| 欧美成人自拍视频| 日韩网站在线观看| 久久久久在线观看| 亚洲激情一区二区三区| 国产在线一区二区三区四区 | 久久久欧美精品sm网站| 欧美大片免费观看| 日韩视频在线播放| 久久激情五月丁香伊人| 亚洲特级毛片| 国产日韩欧美制服另类| 亚洲理论在线观看| 欧美一级视频免费在线观看| 欧美日韩在线观看一区二区| 欧美福利视频| 亚洲免费综合| 欧美午夜大胆人体| 亚洲精品亚洲人成人网| 午夜精品久久久久久久久久久久久| 欧美激情亚洲一区| 亚洲欧美视频一区| 性欧美8khd高清极品| 亚洲电影在线观看| 欧美中文字幕在线视频| 亚洲第一福利视频| 亚洲国产精品一区二区第一页| 午夜精品久久| 亚洲国产精品精华液网站| 亚洲欧美日韩精品一区二区| 亚洲国内欧美| 国产日韩精品视频一区二区三区| 免费永久网站黄欧美| 午夜老司机精品| 久久精品国产清高在天天线| 国产日韩欧美日韩| 欧美日韩免费一区二区三区| 夜夜嗨av一区二区三区网站四季av| 一卡二卡3卡四卡高清精品视频| 欧美激情2020午夜免费观看| 久久激情五月激情| 亚洲性色视频| 亚洲欧美在线一区二区| 日韩视频在线一区二区三区| 在线观看福利一区| 国产日韩精品综合网站| 国产精品成人久久久久| 欧美裸体一区二区三区| 久久精品中文字幕一区| 亚洲自拍啪啪| 另类国产ts人妖高潮视频| 亚洲欧美日韩国产精品| 夜夜嗨av一区二区三区中文字幕| 亚洲第一综合天堂另类专| 国产一区二区三区四区| 国产欧美日韩不卡| 国产精品亚洲综合久久| 久久免费少妇高潮久久精品99| 午夜欧美不卡精品aaaaa| 亚洲午夜91| 免播放器亚洲| 久久综合久久久| 久久午夜精品| 麻豆精品91| 亚洲男人的天堂在线观看| 狠狠色综合一区二区| 欧美精品999| 欧美精品一区在线| 欧美日韩免费观看一区=区三区 | 亚洲一区二区三区四区视频| 麻豆成人综合网| 牛牛国产精品| 午夜久久资源| 久久av老司机精品网站导航| 久久精品三级| 亚洲欧美日韩成人| 亚洲国产高清视频| 亚洲国产欧美一区二区三区久久| 亚洲国产精品尤物yw在线观看 | 国产精品丝袜xxxxxxx| 另类春色校园亚洲| 亚洲一区999| 性色一区二区| 久久字幕精品一区| 欧美日韩国产成人| 国产精品久久久久久久久久直播| 国产女主播一区二区| 在线观看91精品国产入口| 亚洲久久在线| 亚洲国产91| 亚洲一区二区日本| 久久久久免费视频| 欧美激情偷拍| 亚洲影音先锋| 日韩西西人体444www| 欧美电影免费观看高清| 亚洲精品一区久久久久久 | 久久综合给合久久狠狠色 | 亚洲国产精品va在看黑人| 日韩小视频在线观看| 亚洲大片av| 亚洲免费综合| 中文在线资源观看视频网站免费不卡| 亚洲大片在线观看| 欧美**字幕| 亚洲亚洲精品三区日韩精品在线视频| 欧美一区二区| 久久av最新网址| 欧美日韩视频一区二区三区| 欧美激情一区二区三区在线视频观看| 久热成人在线视频| 久久免费视频网站| 久久久人人人| 国产精品夜夜夜| 9人人澡人人爽人人精品| 久久久久久夜| 亚洲免费视频网站|