Java數(shù)據(jù)結(jié)構(gòu)與算法9——紅黑樹

1.平衡與非平衡樹

樹的平衡樹的平衡指的是:樹中每個節(jié)點的左邊后代的數(shù)目,應該和其右邊后代的數(shù)目大致相等棚放。對于隨機數(shù)構(gòu)成的二叉樹紊扬,一般來說是大致平衡的,但是對于有序的數(shù)據(jù)荣茫,二叉樹就嚴重不平衡了,極端情況下场靴,退化成為鏈表啡莉,其時間復雜度下降到 O(N),而不再是平衡樹的O(logN)憎乙。

2.紅黑樹是什么以及特征

紅黑樹(R-B Tree)是什么紅黑樹是一種增加了某些特性的二叉搜索樹票罐,它可以保持樹的大致平衡叉趣。

大致思路是:在插入和刪除節(jié)點的時候泞边,檢查是否破壞了樹的一定的特
征,如果破壞了疗杉,就需要進行糾正阵谚,從而保持樹的平衡。

紅黑樹的特征 :
1)節(jié)點都有顏色
2)在插入和刪除過程中烟具,要遵循保持這些顏色的不同排列的規(guī)則

3.紅黑樹的規(guī)則和修正手段

紅黑樹的規(guī)則(也稱紅黑規(guī)則):

  • 1)每個節(jié)點不是紅色就是黑色
  • 2)根總是黑色
  • 3)如果節(jié)點是紅色的梢什,那么它的子節(jié)點必須是黑色的(反之不必為真)
  • 4)每個空子節(jié)點都是黑的
    這里的空子節(jié)點指的是:對非葉子節(jié)點而言,本可能有朝聋,但實際沒有的那個子節(jié)點嗡午。比如一個節(jié)點只有右子節(jié)點,那么它空缺的左子節(jié)點就是空子節(jié)點冀痕。
  • 5)從根到葉節(jié)點或“空子節(jié)點”的每條路徑荔睹,必須包含相同數(shù)目的黑色節(jié)點(這些黑色節(jié)點的數(shù)目也稱黑色高度)

紅黑樹的修正手段 :

  • 1)改變節(jié)點顏色
  • 2)執(zhí)行旋轉(zhuǎn)操作

4.紅黑樹的旋轉(zhuǎn)

5.紅黑樹的節(jié)點插入算法,并代碼示例

紅黑樹的插入言蛇,前面跟二叉樹插入一樣僻他,就是從根節(jié)點向下查找節(jié)點要插入的位置,然后插入節(jié)點腊尚;插入節(jié)點過后吨拗,后面添加了這樣的操作:檢查樹是否平衡,如果不平衡,就要做修復劝篷,使樹重新變得平衡哨鸭。

插入新的節(jié)點,通常會設置這個節(jié)點為紅色娇妓,因為這樣違反紅黑規(guī)則的幾
率較小兔跌,插入節(jié)點后,有以下幾種情況:

  • 1)如果插入的是根節(jié)點峡蟋,那么違反規(guī)則2坟桅,就直接把節(jié)點修改為黑色
  • 2)如果插入節(jié)點的父節(jié)點是黑色的,說明符合規(guī)則蕊蝗,什么都不做
  • 3)如果插入節(jié)點的父節(jié)點是紅色的仅乓,且祖父結(jié)點的另一個子節(jié)點(叔叔節(jié)點)也是紅色的
    那么:將祖父節(jié)點變紅,而父和叔節(jié)點變黑蓬戚,然后設置祖父節(jié)點為當前節(jié)點夸楣,然后重新開始判斷。
  • 4)如果插入節(jié)點的父節(jié)點是紅色子漩,而叔節(jié)點是黑色豫喧,且插入節(jié)點是其父的左子節(jié)點,而父節(jié)點是祖父節(jié)點的左子節(jié)點
    那么:把父節(jié)點變?yōu)楹谏逼茫娓腹?jié)點變?yōu)榧t色紧显,然后對祖父節(jié)點進行右旋,然后重新開始判斷缕棵。
  • 5)如果插入節(jié)點的父節(jié)點是紅色孵班,而叔節(jié)點是黑色,且插入節(jié)點是其父的右子節(jié)點招驴,而父節(jié)點是祖父節(jié)點的右子節(jié)點
    那么:把父節(jié)點變?yōu)楹谏莩蹋娓腹?jié)點變?yōu)榧t色,然后對祖父節(jié)點進行左旋别厘,然后重新開始判斷虱饿。
  • 6)如果插入節(jié)點的父節(jié)點是紅色,而叔節(jié)點是黑色触趴,且插入節(jié)點是其父的右子節(jié)點氮发,而父節(jié)點是祖父節(jié)點的左子節(jié)點
    那么:把當前節(jié)點的父節(jié)點做為新的當前節(jié)點,對新的當前節(jié)點進行左旋雕蔽,然后重新開始判斷折柠。
  • 7)如果插入節(jié)點的父節(jié)點是紅色,而叔節(jié)點是黑色批狐,且插入節(jié)點是其父的左子節(jié)點扇售,而父節(jié)點是祖父節(jié)點的右子節(jié)點
    那么:把當前節(jié)點的父節(jié)點做為新的當前節(jié)點前塔,對新的當前節(jié)點進行右旋,然后重新開始判斷承冰。

6.紅黑樹的節(jié)點刪除算法华弓,并代碼示例

紅黑樹的節(jié)點刪除在前面學習二叉樹的時候,我們知道做節(jié)點刪除是很復雜的困乒,同樣寂屏,在紅黑樹里面做節(jié)點刪除,也是很復雜的娜搂,甚至比二叉樹的節(jié)點刪除更復雜迁霎,因為還需要保證刪除節(jié)點后,進行樹的平衡百宇。因此考廉,在實際開發(fā)中,多數(shù)情況下不用去做紅黑樹的節(jié)點刪除携御,而是采用其它變通方法:比如僅僅標識這個節(jié)點被刪除昌粤,并不真的刪除,這樣樹就不用動啄刹,在進行業(yè)務處理的時候涮坐,判斷一下,跳過這些節(jié)點就可以了誓军。

紅黑樹的刪除算法

  • 1)如果刪除節(jié)點是葉子節(jié)點
    (1)如果刪除節(jié)點是紅色的袱讹,那就直接刪除,不做其它操作
    (2)如果刪除節(jié)點是黑色的谭企,那么就創(chuàng)建一個空節(jié)點來頂替刪除節(jié)點廓译,然后按照后面的調(diào)整步驟進行調(diào)整
  • 2)如果刪除節(jié)點有一個子節(jié)點,把后來頂替被刪節(jié)點的那個節(jié)點成為頂替節(jié)點债查,如果刪除節(jié)點為黑,而且頂替節(jié)點也為黑瓜挽,那么把頂替節(jié)點當作當前節(jié)點盹廷,然后按照后面的調(diào)整步驟進行調(diào)整。
  • 3)如果刪除節(jié)點有兩個子節(jié)點久橙,那么俄占,找到其中序后繼節(jié)點,把這兩個節(jié)點的數(shù)據(jù)交換一下淆衷,不要復制顏色缸榄,也不改變其原有的父子等關系,然后重新進行刪除祝拯。由于其中序后繼節(jié)點只可能是葉子節(jié)點或者只有一個子節(jié)點甚带,因此回到前面兩種情況她肯。

刪除步驟后的調(diào)整步驟,有以下幾種情況:

  • 1)當前節(jié)點是紅
    那么:直接把當前節(jié)點變成黑色鹰贵,結(jié)束
  • 2)當前節(jié)點是黑且是根節(jié)點
    那么:什么都不用做晴氨,結(jié)束
  • 3)當前節(jié)點是黑且兄弟節(jié)點為紅色,當前節(jié)點為父節(jié)點的左子節(jié)點
    那么:把兄弟結(jié)點變成父節(jié)點的顏色碉输,把父節(jié)點變成紅色籽前,然后在父節(jié)點上做左旋,再重新開始判斷敷钾。
  • 4)當前節(jié)點是黑且兄弟節(jié)點為紅色枝哄,當前節(jié)點為父節(jié)點的右子節(jié)點
    那么:把兄弟結(jié)點變成父節(jié)點的顏色,把父節(jié)點變成紅色阻荒,然后在父節(jié)點上做右旋膘格,再重新開始判斷。
  • 5)當前節(jié)點是黑且父節(jié)點和兄弟節(jié)點都為黑色财松,兄弟節(jié)點的兩個子節(jié)點全為黑色
    那么:把兄弟節(jié)點變紅瘪贱,然后把父節(jié)點當成新的當前節(jié)點,再重新開始判斷
  • 6)當前節(jié)點是黑且兄弟節(jié)點為黑色辆毡,兄弟節(jié)點的兩個子節(jié)點都是黑色菜秦,但是父節(jié)點是紅色
    那么:就把兄弟節(jié)點變紅,父節(jié)點變黑舶掖,結(jié)束
  • 7)當前節(jié)點是黑且兄弟節(jié)點為黑色球昨,兄弟節(jié)點的左子是紅色,右子是黑色眨攘,而且當前節(jié)點是父節(jié)點的左子節(jié)點
    那么:把兄弟節(jié)點變紅主慰,兄弟左子節(jié)點變黑,然后對兄弟節(jié)點進行右旋鲫售,再重新開始判斷
  • 8)當前節(jié)點是黑且兄弟節(jié)點為黑色共螺,兄弟節(jié)點的左子是黑色,右子是紅色情竹,而且當前節(jié)點是父節(jié)點的右子節(jié)點
    那么:把兄弟節(jié)點變紅藐不,兄弟右子節(jié)點變黑,然后對兄弟節(jié)點左旋秦效,再重新開始判斷
  • 9)當前節(jié)點是黑且兄弟節(jié)點為黑色雏蛮,兄弟節(jié)點的右子是紅色,左子的顏色任意阱州,而且當前節(jié)點是父節(jié)點的左子節(jié)點
    那么:把兄弟節(jié)點變成當前節(jié)點父節(jié)點的顏色挑秉,把當前節(jié)點父節(jié)點變黑,兄弟節(jié)點右子變黑苔货,然后以當前節(jié)點的父節(jié)點為支點進行左旋犀概,結(jié)束立哑。
  • 10)當前節(jié)點是黑且兄弟節(jié)點為黑色,兄弟節(jié)點的左子是紅色阱冶,右子的顏色任意刁憋,而且當前節(jié)點是父節(jié)點的右子節(jié)點
    那么:把兄弟節(jié)點變成當前節(jié)點父節(jié)點的顏色,把當前節(jié)點父節(jié)點變黑木蹬,兄弟節(jié)點左子變黑至耻,然后以當前節(jié)點的父節(jié)點為支點進行右旋,結(jié)束镊叁。

7.紅黑樹的效率

紅黑樹的效率紅黑樹的查找尘颓、插入和刪除的時間復雜度都是O(logN),以2為底晦譬。跟二叉樹是一樣的疤苹,但實際上,由于紅黑樹在插入和刪除的時候敛腌,需要保證樹的平衡卧土,所以會比二叉樹慢。另外一個像樊,紅黑樹的節(jié)點需要多一點額外的空間尤莺,來存儲顏色信息。

8.了解其它的平衡樹

AVL(發(fā)明者為:Adelson-Velskii和Landis)樹是最早的一種平衡樹生棍,它要求節(jié)點左子樹和右子樹的高度相差不超過1颤霎。當插入和刪除節(jié)點的時候,都需要重新平衡樹涂滴,也就是每次操作會掃描兩趟樹友酱,一次向下查找節(jié)點,一次向上平衡樹柔纵。 AVL樹的效率不如紅黑樹缔杉,也不如紅黑樹常用,因此了解一下即可首量。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壮吩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子加缘,更是在濱河造成了極大的恐慌,老刑警劉巖觉啊,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拣宏,死亡現(xiàn)場離奇詭異,居然都是意外死亡杠人,警方通過查閱死者的電腦和手機勋乾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門宋下,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辑莫,你說我怎么就攤上這事学歧。” “怎么了各吨?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵枝笨,是天一觀的道長。 經(jīng)常有香客問我揭蜒,道長横浑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任屉更,我火速辦了婚禮徙融,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瑰谜。我一直安慰自己欺冀,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布萨脑。 她就那樣靜靜地躺著隐轩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砚哗。 梳的紋絲不亂的頭發(fā)上龙助,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音蛛芥,去河邊找鬼提鸟。 笑死,一個胖子當著我的面吹牛仅淑,可吹牛的內(nèi)容都是我干的称勋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼涯竟,長吁一口氣:“原來是場噩夢啊……” “哼赡鲜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庐船,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤银酬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后筐钟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揩瞪,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年篓冲,在試婚紗的時候發(fā)現(xiàn)自己被綠了李破。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宠哄。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嗤攻,靈堂內(nèi)的尸體忽然破棺而出毛嫉,到底是詐尸還是另有隱情,我是刑警寧澤妇菱,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布承粤,位于F島的核電站,受9級特大地震影響恶耽,放射性物質(zhì)發(fā)生泄漏密任。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一偷俭、第九天 我趴在偏房一處隱蔽的房頂上張望浪讳。 院中可真熱鬧,春花似錦涌萤、人聲如沸淹遵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽透揣。三九已至,卻和暖如春川抡,著一層夾襖步出監(jiān)牢的瞬間辐真,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工崖堤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侍咱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓密幔,卻偏偏與公主長得像楔脯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胯甩,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • R-B Tree簡介 R-B Tree昧廷,全稱是Red-Black Tree,又稱為“紅黑樹”偎箫,它一種特殊的二叉查找...
    張晨輝Allen閱讀 9,230評論 5 30
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)木柬,樹與前面介紹的線性表,棧淹办,隊列等線性結(jié)構(gòu)不同弄诲,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,432評論 1 31
  • 你要察看神的作為齐遵,因神使為曲的,誰能變?yōu)橹蹦厮澹俊獋鞯罆?年輕的時候一腔熱血梗摇,哭笑不自知,自作多情想许,回頭看來伶授,傻的...
    William王漢閱讀 628評論 0 1
  • 最近,孩子媽媽到北京去學習了流纹,開始了她又一次的覺醒和蛻變糜烹。我獨自帶孩子,原來很擔心家里我們這兩個男人又是一番...
    張鵬遠龍文閱讀 391評論 1 3
  • 故事發(fā)生在兩人之間愕乎,想必很多人也曾遇到過這樣子的事情。 一天A和B一起逛街壁公,B身上帶的現(xiàn)金不夠了感论,店里面恰好沒有p...
    我是鹿零閱讀 1,161評論 3 8