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

隨筆 - 70  文章 - 160  trackbacks - 0

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

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

積分與排名

  • 積分 - 180337
  • 排名 - 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>
              欧美亚洲视频在线看网址| 有码中文亚洲精品| 一区二区三区久久网| 欧美激情久久久| 久久精品99国产精品| 亚洲欧美成人综合| 欧美在线你懂的| 久久九九久久九九| 久久久www成人免费毛片麻豆| 欧美一级精品大片| 久久国产精品久久久久久久久久 | 欧美在线视频全部完| 午夜精品久久久久久99热软件| 午夜精品久久久久久99热| 久久乐国产精品| 亚洲国产精品久久久久婷婷884| 欧美一区二区三区日韩| 久久精品二区三区| 欧美激情综合在线| 欧美日韩中文字幕日韩欧美| 国产欧美日韩专区发布| 精品av久久707| 一区二区电影免费观看| 亚洲免费在线电影| 久热精品视频在线| 最新国产拍偷乱拍精品| 午夜精品一区二区三区在线视 | 国产精品久久久久9999| 国内精品久久久久久久果冻传媒| 亚洲美女淫视频| 欧美在线亚洲在线| 亚洲国产婷婷| 欧美中文在线字幕| 欧美性一二三区| 亚洲国产精品va在线观看黑人| 亚洲午夜一二三区视频| 欧美电影电视剧在线观看| 亚洲制服av| 欧美日韩在线大尺度| 亚洲第一区在线观看| 久久国产精品99精品国产| 日韩视频一区二区在线观看 | 亚洲美女在线看| 乱中年女人伦av一区二区| 国产精品亚洲综合天堂夜夜| 亚洲伦理在线观看| 免费h精品视频在线播放| 亚洲一区久久| 欧美午夜精品久久久久久孕妇 | 91久久久久久国产精品| 午夜精品福利一区二区三区av| 牛牛国产精品| 久久精品99| 国产日韩欧美一区二区三区四区| 一区二区三区视频在线看| 精品9999| 国产老女人精品毛片久久| 一区二区三区高清不卡| 欧美好吊妞视频| 久久精品中文字幕免费mv| 国产欧美日韩专区发布| 性欧美超级视频| 亚洲图色在线| 欧美体内she精视频| 99精品久久| 亚洲精品国产精品国自产在线 | 免费在线亚洲| 亚洲国产成人精品久久久国产成人一区| 欧美专区第一页| 欧美在线影院| 亚洲成色最大综合在线| 免费欧美在线视频| 老色批av在线精品| 亚洲国产美女| 亚洲国产日韩欧美在线99| 欧美电影免费观看高清| 亚洲精品一区二区三区四区高清| 欧美激情影院| 欧美日本一道本| 夜色激情一区二区| 亚洲免费观看视频| 国产精品伦一区| 久久精品人人| 久久野战av| 91久久综合亚洲鲁鲁五月天| 日韩午夜在线播放| 国产欧美日韩综合| 欧美电影在线观看完整版| 欧美二区在线| 亚洲影院污污.| 久久国产88| 亚洲美女尤物影院| 亚洲综合日韩| 亚洲国产精品va在看黑人| 99在线|亚洲一区二区| 国产日韩欧美成人| 亚洲激情在线观看| 国产欧美日韩亚州综合| 欧美成人网在线| 国产精品久久久一区麻豆最新章节 | 亚洲黄色毛片| 国产精品一区二区视频| 欧美黄在线观看| 国产精自产拍久久久久久| 欧美成人蜜桃| 国产精品夜夜夜| 亚洲精品国精品久久99热| 国产精品欧美一区二区三区奶水| 老色批av在线精品| 国产精品扒开腿做爽爽爽视频| 久久久久久久久久看片| 欧美高清不卡| 噜噜噜躁狠狠躁狠狠精品视频| 欧美性色视频在线| 欧美在线一区二区| 欧美主播一区二区三区| 欧美日韩xxxxx| 久久婷婷麻豆| 国产精品第一区| 亚洲精品在线观| 在线精品一区| 亚洲免费综合| 亚洲图片欧洲图片av| 久久精品国产亚洲一区二区三区 | 国产精品久久久久久av福利软件| 久久嫩草精品久久久精品| 欧美日韩一区二区欧美激情| 欧美国产一区视频在线观看| 国产一区二区三区久久| 亚洲天堂男人| 亚洲一区二区三区在线看| 欧美精品一区二区三区久久久竹菊| 久久午夜精品| 国内精品久久久久影院优| 午夜精品久久| 久久精品一本| 国产一区99| 久久激情综合网| 久久在线视频| 亚洲黑丝在线| 欧美另类高清视频在线| 亚洲人久久久| 亚洲专区国产精品| 国产精品久久久久毛片大屁完整版 | 欧美激情日韩| 亚洲日韩视频| 亚洲视频999| 欧美午夜片在线观看| 亚洲经典三级| 一本色道88久久加勒比精品| 欧美日韩午夜在线视频| 中文日韩欧美| 久久久一二三| 亚洲精品视频免费在线观看| 欧美精品18+| 亚洲视频在线二区| 欧美一区二区三区免费看| 国产综合久久久久影院| 久久久久高清| 亚洲欧洲一区二区在线观看| 亚洲无玛一区| 韩国女主播一区二区三区| 欧美aa国产视频| 亚洲一区在线看| 欧美超级免费视 在线| 99re热这里只有精品免费视频| 欧美日韩精品欧美日韩精品| 亚洲一区二区在线免费观看| 麻豆久久久9性大片| 日韩一级黄色av| 国产农村妇女毛片精品久久麻豆 | 国产精品羞羞答答| 久久成人免费电影| 最近看过的日韩成人| 99在线|亚洲一区二区| 好吊色欧美一区二区三区视频| 亚洲欧美中文日韩在线| 久久综合激情| 在线一区二区三区做爰视频网站| 国产精品天美传媒入口| 久久久久久综合网天天| 日韩亚洲国产精品| 久久婷婷激情| 午夜精品久久久久久久男人的天堂 | 久久成人国产| 日韩一级在线| 欧美www视频在线观看| 亚洲一级黄色片| 尤物99国产成人精品视频| 欧美激情一区二区三区蜜桃视频| 亚洲欧美在线另类| 欧美激情aⅴ一区二区三区| 午夜久久电影网| 亚洲精选在线观看| 国内精品久久久久久久影视蜜臀| 欧美日韩综合久久| 免费在线看成人av| 亚洲欧美日韩中文视频| 亚洲精品精选| 欧美国产在线观看|