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

隨筆 - 70  文章 - 160  trackbacks - 0

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

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

積分與排名

  • 積分 - 180360
  • 排名 - 147

最新評論

閱讀排行榜

評論排行榜

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

插入結點用到了上一次BST的插入函數(做了一點添加),并且在此基礎上增加了保持紅黑性質的調整函數。

還是先看看插入函數:

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
            
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);
            }

和上一次的BST基本沒區別,只是添加了對新加結點z的顏色和子節點的處理。

這里把z的顏色設置為紅色,然后進行處理。

:考慮為何把z的顏色設置為紅色

:個人認為如果設置為黑色,則破壞了性質五,而性質五關于黑高度的問題,涉及到了整棵樹,全局性難以把握,所以這里設置為紅色,雖然破壞了性質4,然是相對破壞性質5來說,更容易恢復紅黑性質。大家如果有不同的想法,也可以留言談談。

接下來,就是對整棵樹的調整了。

答:考慮插入z結點后,破壞的哪幾條紅黑性質?

答:破壞了性質2和性質4.

5條紅黑性質要熟記,我這里再貼出來:

1. 每個結點或是紅色,或是是黑色。
2. 根結點是黑的。
3. 所有的葉結點(NULL)是黑色的。(NULL被視為一個哨兵結點,所有應該指向NULL的指針,都看成指向了NULL結點。)
4. 如果一個結點是紅色的,則它的兩個兒子節點都是黑色的。
5. 對每個結點,從該結點到其子孫結點的所有路徑上包含相同數目的黑結點。

所以我們要做的就是恢復性質2和性質4.

先來看看具體實現的代碼(這里只貼出部分代碼):

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
            
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
            {
            ///////////////////////
            }
            }
            T->color = BLACK;
            }

分三種情況,在代碼中已用Case 1, Case 2, Case 3標記出。

大致說下判斷情況:

1.首先讓一個指針y指向z的叔父結點(z是要刪除的結點)。

2.如果y的顏色是紅色,Case 1。則使z的父親結點和叔父結點的顏色改為黑,z的祖父結點顏色改為紅。然后讓z轉移到z的祖父結點。

3.當y的顏色是黑色時,

①.首先判斷z是否是其父親結點的右兒子,若是,則調整為左兒子(用旋轉)。

②.其次使z的父親結點顏色為黑,z的祖父結點顏色為紅,并以z的祖父結點為軸右旋。

具體我還是在草稿紙上畫出。。。(可憐買不起數碼相機,只能用手機拍了。。。)

rbt_charu1

rbt_charu2

rbt_charu3

(弱弱的問一句,看見網上有很多朋友做的一些代碼講解圖很給力,不知道大家有什么軟件嗎?求推薦。。。)

以下是插入的完整代碼:

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
            
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);
            }

下一篇是關于紅黑樹的刪除。


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

歡迎大家互相學習,互相討論!

 

posted on 2011-05-08 08:26 Tanky Woo 閱讀(1524) 評論(1)  編輯 收藏 引用

FeedBack:
# re: 《算法導論》學習總結 — 13. 第13章 紅黑樹(2) 2011-05-09 00:00 釀妹汁
腦圖工具使用xmind,中國人開發的,還不錯
mindManager也行,跟xmind類似,但是功能多了些,不過一般不會用
編程方面,更多用的是UML工具,免費開源的用bouml,想要好看又好用的,那就Visual Paradigm吧...  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
              国产精品久久国产愉拍| 一区二区三区精品国产| 在线观看一区欧美| 黄色成人av| 亚洲国产高清自拍| 亚洲人体1000| 一本久久青青| 亚洲欧美日韩综合国产aⅴ| 亚洲免费在线观看视频| 久久久久国产一区二区| 免费91麻豆精品国产自产在线观看| 美女久久一区| 日韩视频在线一区二区| 香蕉久久a毛片| 美女视频一区免费观看| 欧美精品一区二区三区高清aⅴ| 欧美77777| 亚洲国产视频a| 最新国产乱人伦偷精品免费网站| 亚洲日产国产精品| 欧美一二三区在线观看| 欧美高清在线播放| 亚洲欧美日韩国产成人| 欧美成年人网站| 国产欧美二区| 中文日韩欧美| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲视频在线一区| 久久精品99无色码中文字幕| 欧美久久99| 黄色小说综合网站| 亚洲女与黑人做爰| 亚洲高清自拍| 午夜日本精品| 欧美日韩专区| 亚洲精品一区二| 久久久久国产精品一区| 中文精品一区二区三区 | 中文一区在线| 欧美高清视频免费观看| 狠狠狠色丁香婷婷综合激情| 亚洲专区一区| 日韩午夜剧场| 欧美日本高清视频| 亚洲精品国产精品国自产在线| 久久影音先锋| 久久成人人人人精品欧| 国产毛片一区二区| 午夜欧美电影在线观看| 99国产精品视频免费观看一公开| 欧美国产极速在线| 99riav1国产精品视频| 亚洲福利视频一区二区| 美日韩精品视频| 在线观看欧美日韩| 欧美freesex8一10精品| 久久一区亚洲| 亚洲欧洲美洲综合色网| 欧美激情亚洲一区| 欧美极品一区| 在线综合亚洲| 亚洲制服欧美中文字幕中文字幕| 国产精品久久久久一区二区三区共| 亚洲视频在线观看免费| 在线一区二区日韩| 国产精品永久免费在线| 香蕉免费一区二区三区在线观看 | 一区二区三区日韩在线观看| 欧美日本三级| 亚洲一区在线观看免费观看电影高清| 亚洲国产高清在线| 伊人成年综合电影网| 久久久www免费人成黑人精品 | 欧美成人69| 亚洲精品一区二区三区av| 亚洲国产一区二区三区在线播| 欧美承认网站| 亚洲一区二区动漫| 午夜视频一区二区| 亚洲国产小视频在线观看| 亚洲国产成人在线播放| 欧美日韩国产综合新一区| 午夜精品福利在线| 久久久久天天天天| 在线一区亚洲| 欧美在线黄色| 日韩手机在线导航| 亚洲欧美日韩中文视频| 在线观看一区二区视频| 99精品热视频| 红桃视频国产精品| 亚洲美女色禁图| 国产一区二区三区无遮挡| 欧美激情精品久久久久久蜜臀| 欧美日韩精品免费观看视一区二区| 亚洲一区国产视频| 老色批av在线精品| 欧美一区亚洲一区| 免费观看在线综合色| 欧美一区二区三区精品| 欧美国产视频日韩| 久久精品亚洲热| 欧美日韩午夜在线| 久久久亚洲国产美女国产盗摄| 欧美屁股在线| 欧美freesex8一10精品| 国产精品私房写真福利视频| 亚洲第一综合天堂另类专| 国产日韩亚洲| 亚洲一区二区三区午夜| 99热在线精品观看| 久久午夜国产精品| 久久久久欧美| 国产精品一区三区| 99热在线精品观看| 99热免费精品在线观看| 久久久久成人精品| 久久久蜜桃精品| 国产日韩欧美三级| 亚洲欧美美女| 篠田优中文在线播放第一区| 欧美人妖在线观看| 亚洲国产精品一区二区第四页av | 欧美另类变人与禽xxxxx| 久久亚洲综合色| 国产伪娘ts一区| 亚洲影院色在线观看免费| 亚洲午夜久久久| 欧美绝品在线观看成人午夜影视| 欧美成人按摩| 亚洲第一区色| 欧美成在线观看| 91久久线看在观草草青青| 亚洲欧美综合另类中字| 国产伦精品一区二区三区视频孕妇| 亚洲人成绝费网站色www| 亚洲国产日韩欧美在线动漫| 久久久91精品国产一区二区三区| 久久精品亚洲乱码伦伦中文 | 亚洲欧美资源在线| 国产精品扒开腿做爽爽爽视频| 亚洲每日在线| 亚洲一区免费网站| 国产精品免费看| 欧美专区在线| 欧美国产在线电影| 艳女tv在线观看国产一区| 欧美日韩的一区二区| 99视频+国产日韩欧美| 午夜在线视频观看日韩17c| 国产丝袜一区二区| 久久综合一区二区三区| 亚洲国产精品一区二区三区| 夜夜嗨av一区二区三区四区| 欧美亚韩一区| 久久超碰97人人做人人爱| 欧美福利一区二区| 一区二区三区日韩欧美精品| 国产噜噜噜噜噜久久久久久久久| 欧美亚洲免费高清在线观看| 免费国产一区二区| 一区二区三区国产在线| 国产欧美欧美| 久久综合九色九九| 99国产精品视频免费观看| 久久狠狠婷婷| 日韩午夜av| 国产色视频一区| 欧美不卡在线视频| 校园春色综合网| 亚洲精品日日夜夜| 久久综合色播五月| 亚洲五月六月| 亚洲福利专区| 国产伦精品一区二区| 欧美成人在线免费观看| 性欧美videos另类喷潮| 亚洲国产欧洲综合997久久| 欧美一区二区三区日韩视频| 亚洲激情成人在线| 国产日韩欧美视频在线| 欧美精品一区三区在线观看| 久久国产精品久久久久久久久久| 亚洲清纯自拍| 欧美 日韩 国产精品免费观看| 香蕉久久a毛片| 一区二区三区国产在线| 亚洲高清视频在线| 国产亚洲欧美一区二区| 欧美午夜激情视频| 欧美成人官网二区| 久久久久国产一区二区三区四区 | 香蕉久久一区二区不卡无毒影院| 亚洲人成在线观看一区二区| 国产在线观看精品一区二区三区| 欧美全黄视频| 欧美顶级大胆免费视频| 久久另类ts人妖一区二区| 性欧美xxxx视频在线观看| 中文日韩在线视频|