紅黑樹(shù)的快速實(shí)現(xiàn)

紅黑樹(shù)的概述:

紅黑樹(shù)本質(zhì)上是一種二叉查找樹(shù)橙喘,但它在二叉查找樹(shù)的基礎(chǔ)上額外添加了一個(gè)標(biāo)記(顏色)时鸵,同時(shí)具有一定的規(guī)則。這些規(guī)則使紅黑樹(shù)保證了一種平衡厅瞎,插入饰潜、刪除初坠、查找的最壞時(shí)間復(fù)雜度都為 O(logn)。


紅黑樹(shù)的性質(zhì):

1囊拜、每個(gè)節(jié)點(diǎn)要么是紅色某筐,要么是黑色比搭;
2冠跷、根節(jié)點(diǎn)永遠(yuǎn)是黑色的;
3身诺、所有的葉節(jié)點(diǎn)都是是黑色的(注意這里說(shuō)葉子節(jié)點(diǎn)其實(shí)是上圖中的 NIL 節(jié)點(diǎn))蜜托;
4、每個(gè)紅色節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)一定都是黑色霉赡;
5橄务、從任一節(jié)點(diǎn)到其子樹(shù)中每個(gè)葉子節(jié)點(diǎn)的路徑都包含相同數(shù)量的黑色節(jié)點(diǎn)。


紅黑樹(shù)的旋轉(zhuǎn)

左旋:將一個(gè)向右傾斜的紅色鏈接旋轉(zhuǎn)為向左鏈接穴亏。對(duì)比操作前后蜂挪,可以看出,該操作實(shí)際上是將紅線鏈接的兩個(gè)節(jié)點(diǎn)中的一個(gè)較大的節(jié)點(diǎn)移動(dòng)到根節(jié)點(diǎn)上嗓化。

image

右旋:與左旋剛好相反棠涮,這里就不贅述了,直接看圖刺覆。
image


紅黑樹(shù)的插入與調(diào)整

因?yàn)橐獫M足紅黑樹(shù)的這五條性質(zhì)严肪,如果我們插入的是黑色節(jié)點(diǎn),那就違反了性質(zhì)五谦屑,需要進(jìn)行大規(guī)模調(diào)整驳糯;如果我們插入的是紅色節(jié)點(diǎn),那就只有在要插入節(jié)點(diǎn)的父節(jié)點(diǎn)也是紅色的時(shí)候違反性質(zhì)四或者當(dāng)插入的節(jié)點(diǎn)是根節(jié)點(diǎn)時(shí)氢橙,違反性質(zhì)二酝枢,所以,我們把要插入的節(jié)點(diǎn)的顏色變成紅色悍手。

不需要調(diào)整的情況:
1帘睦、當(dāng)插入的節(jié)點(diǎn)是根節(jié)點(diǎn)時(shí),直接涂黑即可谓苟;
2官脓、當(dāng)要插入的節(jié)點(diǎn)的父節(jié)點(diǎn)是黑色的時(shí)候,這個(gè)時(shí)候插入一個(gè)紅色的節(jié)點(diǎn)并沒(méi)有對(duì)這五個(gè)性質(zhì)產(chǎn)生破壞涝焙。所以直接插入不用在進(jìn)行調(diào)整操作卑笨。

需要調(diào)整的情況:即插入節(jié)點(diǎn)的父結(jié)點(diǎn)也是紅色
因?yàn)樽笥覍?duì)稱的緣故仑撞,在此只討論父結(jié)點(diǎn)位于祖父節(jié)點(diǎn)的左支的情況(N 為插入節(jié)點(diǎn)):

1赤兴、叔叔節(jié)點(diǎn)是紅色
這時(shí)候只進(jìn)行換色操作:將父結(jié)點(diǎn)和叔叔節(jié)點(diǎn)涂成黑色妖滔,祖父節(jié)點(diǎn)涂成紅色。


image

2桶良、叔叔節(jié)點(diǎn)是黑色座舍,插入節(jié)點(diǎn)位于父節(jié)點(diǎn)的右支
這時(shí)候需要將父結(jié)點(diǎn)當(dāng)成新的插入節(jié)點(diǎn),并以他為支點(diǎn)進(jìn)行左旋操作陨帆,進(jìn)入情況3 曲秉。


image

3、叔叔節(jié)點(diǎn)是黑色疲牵,插入節(jié)點(diǎn)位于父結(jié)點(diǎn)的左支
這時(shí)候需要先進(jìn)行換色操作:將父結(jié)點(diǎn)涂成黑色承二,祖父節(jié)點(diǎn)涂成紅色;然后進(jìn)行右旋操作纲爸。
image

紅黑樹(shù)的刪除與調(diào)整

如果被刪除結(jié)點(diǎn)有孩子亥鸠,則需要選一個(gè)合適的孩子節(jié)點(diǎn)作為新的根節(jié)點(diǎn),稱為當(dāng)前節(jié)點(diǎn)识啦。
1负蚊、只有左孩子或只有右孩子,則讓該孩子作為當(dāng)前節(jié)點(diǎn)替代被刪除結(jié)點(diǎn)颓哮;
2家妆、左右孩子均存在,則用被刪除結(jié)點(diǎn)的中序后繼結(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn)替代被刪除結(jié)點(diǎn)题翻。

注意:替代只是值的互換揩徊,顏色不變
即:當(dāng)前節(jié)點(diǎn)是黑色嵌赠,被刪除結(jié)點(diǎn)是紅色塑荒。替換后,當(dāng)前節(jié)點(diǎn)位于被刪除結(jié)點(diǎn)的位置姜挺,是紅色齿税;被刪除結(jié)點(diǎn)位于當(dāng)前節(jié)點(diǎn)原來(lái)的位置,是黑色炊豪。

不需要調(diào)整的情況:
1凌箕、被刪除結(jié)點(diǎn)的是紅色的;
2词渤、被刪除結(jié)點(diǎn)只有一個(gè)孩子牵舱,用孩子的值替換被刪除節(jié)點(diǎn),刪除孩子結(jié)點(diǎn)缺虐。

需要調(diào)整的情況:(被刪除節(jié)點(diǎn)為黑色)
因?yàn)樽笥覍?duì)稱的緣故芜壁,在此只討論父結(jié)點(diǎn)位于祖父節(jié)點(diǎn)的左支的情況:
1、兄弟節(jié)點(diǎn)為紅色
這時(shí)候需要互換父結(jié)點(diǎn)和兄弟節(jié)點(diǎn)的顏色,并進(jìn)行左旋操作慧妄。

image

2顷牌、兄弟節(jié)點(diǎn)為黑色,且其左右孩子也為黑色
將兄弟節(jié)點(diǎn)涂成紅色塞淹,再將父結(jié)點(diǎn)當(dāng)成新的被刪除結(jié)點(diǎn)(只是當(dāng)成窟蓝,并不刪除)進(jìn)行一次調(diào)整(右圖中少了根節(jié)點(diǎn)的左孩子被刪除元素)。
image

3饱普、兄弟節(jié)點(diǎn)為黑色运挫,且其左孩子為紅色
先換色:左孩子涂成黑色,兄弟節(jié)點(diǎn)涂成紅色费彼;再以兄弟節(jié)點(diǎn)為支點(diǎn)右旋滑臊。變成情況4 。
image

4箍铲、兄弟節(jié)點(diǎn)為黑色,且其右孩子為紅色
先換色:父結(jié)點(diǎn)的顏色賦給兄弟節(jié)點(diǎn)鬓椭,父結(jié)點(diǎn)涂成黑色颠猴,兄弟節(jié)點(diǎn)的右孩子涂成黑色;再左旋(右圖中a 的左孩子是被刪除元素)小染。
image


紅黑樹(shù)的查找

與二叉排序樹(shù)的查找一樣:從根節(jié)點(diǎn)出發(fā)翘瓮,待找值較大時(shí)往右子樹(shù)方向查找,待找值較小時(shí)往左子樹(shù)方向查找裤翩,直到找到匹配的結(jié)點(diǎn)资盅。若找不到則查找失敗。


紅黑樹(shù)的應(yīng)用

Epoll 實(shí)現(xiàn)踊赠、Java集合中的 TreeSet 和 TreeMap呵扛、C++ STL 中的 set、map筐带,以及 Linux 虛擬內(nèi)存的管理今穿,都是通過(guò)紅黑樹(shù)去實(shí)現(xiàn)的。
在平時(shí)也可以應(yīng)用于各種管理系統(tǒng)的查找算法中伦籍,借此提高效率蓝晒。


在線生成紅黑樹(shù)

看完本教程,如果你還不太能清楚的寫(xiě)出紅黑樹(shù)的構(gòu)造過(guò)程帖鸦,那么芝薇,這一個(gè)網(wǎng)站將能很好地幫助到你。它不僅支持手動(dòng)輸入結(jié)點(diǎn)值作儿,也能隨機(jī)生成結(jié)點(diǎn)洛二,更重要的是,該網(wǎng)站把每一次插入、刪除的調(diào)整步驟都展現(xiàn)了出來(lái)灭红。趕緊試試吧侣滩!
在線生成紅黑樹(shù)(含變形步驟)



更多內(nèi)容請(qǐng)移步微信公眾號(hào) “ 暗星涌動(dòng) ”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市变擒,隨后出現(xiàn)的幾起案子君珠,更是在濱河造成了極大的恐慌,老刑警劉巖娇斑,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件策添,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡毫缆,警方通過(guò)查閱死者的電腦和手機(jī)唯竹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苦丁,“玉大人浸颓,你說(shuō)我怎么就攤上這事⊥” “怎么了产上?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蛾狗。 經(jīng)常有香客問(wèn)我晋涣,道長(zhǎng),這世上最難降的妖魔是什么沉桌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任谢鹊,我火速辦了婚禮,結(jié)果婚禮上留凭,老公的妹妹穿的比我還像新娘佃扼。我一直安慰自己,他們只是感情好冰抢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布松嘶。 她就那樣靜靜地躺著,像睡著了一般挎扰。 火紅的嫁衣襯著肌膚如雪翠订。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天遵倦,我揣著相機(jī)與錄音尽超,去河邊找鬼。 笑死梧躺,一個(gè)胖子當(dāng)著我的面吹牛似谁,可吹牛的內(nèi)容都是我干的傲绣。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巩踏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秃诵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起塞琼,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菠净,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后彪杉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體毅往,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年派近,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了攀唯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渴丸,死狀恐怖侯嘀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曙强,我是刑警寧澤残拐,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站碟嘴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏囊卜。R本人自食惡果不足惜娜扇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栅组。 院中可真熱鬧雀瓢,春花似錦、人聲如沸玉掸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)司浪。三九已至泊业,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啊易,已是汗流浹背吁伺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留租谈,地道東北人篮奄。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窟却。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昼丑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • 0.目錄 1.算法導(dǎo)論的紅黑樹(shù)本質(zhì)上是2-3-4樹(shù) 2.紅黑樹(shù)的結(jié)構(gòu)和性質(zhì) 3.紅黑樹(shù)的插入 4.紅黑樹(shù)的刪除 5...
    王偵閱讀 2,472評(píng)論 1 2
  • 轉(zhuǎn)載請(qǐng)注明出處菩帝!http://www.reibang.com/p/d9d9f223f0ad Github源碼地址...
    yifyif閱讀 4,294評(píng)論 0 7
  • 一. 算法之變,結(jié)構(gòu)為宗 計(jì)算機(jī)在很多情況下被應(yīng)用于檢索數(shù)據(jù)憔足,比如航空和鐵路運(yùn)輸業(yè)的航班信息和列車(chē)時(shí)刻表的查詢胁附,都...
    Leesper閱讀 6,866評(píng)論 13 42
  • 強(qiáng)大的好奇心 第一個(gè),任何一個(gè)創(chuàng)業(yè)者都需要有強(qiáng)大的好奇心滓彰。有一句話叫“好奇害死貓”控妻,好奇心是我們從幼童開(kāi)始就具備的...
    言東閱讀 919評(píng)論 0 1
  • 窗外的雨 下了一夜 偶有雷聲 驚醒了夢(mèng)中的我 身旁是冰冷的枕頭 早已離去的是孤單的心 黑暗中看不見(jiàn)的五指 窗外雷雨...
    海闊天空任逍遙閱讀 211評(píng)論 0 0