精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

傻瓜都能看懂,30張圖徹底理解紅黑樹!

開發(fā) 架構(gòu) 開發(fā)工具
當(dāng)在 10 億數(shù)據(jù)中只需要進(jìn)行十幾次比較就能查找到目標(biāo)時,不禁感嘆編程之魅力!人類之偉大呀!

 當(dāng)在 10 億數(shù)據(jù)中只需要進(jìn)行十幾次比較就能查找到目標(biāo)時,不禁感嘆編程之魅力!人類之偉大呀!

                                                                                                                                              —學(xué)紅黑樹有感

終于,在學(xué)習(xí)了幾天的紅黑樹相關(guān)的知識后,我想把我所學(xué)所想和所感分享給大家。

[[256056]]

 

紅黑樹是一種比較難的數(shù)據(jù)結(jié)構(gòu),要完全搞懂非常耗時耗力,紅黑樹怎么自平衡?什么時候需要左旋或右旋?插入和刪除破壞了樹的平衡后怎么處理?等等一連串的問題在學(xué)習(xí)前困擾著我。

如果你在學(xué)習(xí)過程中也會存在我的疑問,那么本文對你會有幫助,本文幫助你全面、徹底地理解紅黑樹!

本文將通過圖文的方式講解紅黑樹的知識點,并且不會涉及到任何代碼,相信我,在懂得紅黑樹實現(xiàn)原理前,看代碼會一頭霧水的,當(dāng)原理懂了,代碼也就按部就班寫而已,沒任何難度。

閱讀本文你需具備知識點:

  • 二叉查找樹
  • 完美平衡二叉樹

紅黑樹也是二叉查找樹,我們知道,二叉查找樹這一數(shù)據(jù)結(jié)構(gòu)并不難,而紅黑樹之所以難是難在它是自平衡的二叉查找樹,在進(jìn)行插入和刪除等可能會破壞樹的平衡的操作時,需要重新自處理達(dá)到平衡狀態(tài)。

現(xiàn)在在腦海想下怎么實現(xiàn)?是不是太多情景需要考慮了?嘖嘖,先別急,通過本文的學(xué)習(xí)后,你會覺得,其實也不過如此而已。好吧,我們先來看下紅黑樹的定義和一些基本性質(zhì)。

紅黑樹定義和性質(zhì)

紅黑樹是一種含有紅黑結(jié)點并能自平衡的二叉查找樹。它必須滿足下面性質(zhì):

  • 每個節(jié)點要么是黑色,要么是紅色。
  • 根節(jié)點是黑色。
  • 每個葉子節(jié)點(Nil)是黑色。
  • 每個紅色結(jié)點的兩個子結(jié)點一定都是黑色。
  • 任意一結(jié)點到每個葉子結(jié)點的路徑都包含數(shù)量相同的黑結(jié)點。

從性質(zhì) 5 又可以推出:如果一個結(jié)點存在黑子結(jié)點,那么該結(jié)點肯定有兩個子結(jié)點。

 

圖 1:一棵簡單的紅黑樹

上圖就是一顆簡單的紅黑樹。其中 Nil 為葉子結(jié)點,并且它是黑色的。(值得提醒注意的是,在 Java 中,葉子結(jié)點是為 null 的結(jié)點。)

紅黑樹并不是一個完美平衡二叉查找樹,從圖 1 可以看到,根結(jié)點 P 的左子樹顯然比右子樹高。

但左子樹和右子樹的黑結(jié)點的層數(shù)是相等的,也即任意一個結(jié)點到到每個葉子結(jié)點的路徑都包含數(shù)量相同的黑結(jié)點(性質(zhì) 5)。所以我們叫紅黑樹這種平衡為黑色完美平衡。

介紹到此,為了后面講解不至于混淆,我們還需要來約定下紅黑樹一些結(jié)點的叫法,如圖 2 所示:

圖 2:結(jié)點叫法約定

我們把正在處理(遍歷)的結(jié)點叫做當(dāng)前結(jié)點,如圖 2 中的 D,它的父親叫做父結(jié)點,它的父親的另外一個子結(jié)點叫做兄弟結(jié)點,父親的父親叫做祖父結(jié)點。

前面講到紅黑樹能自平衡,它靠的是什么?有如下三種操作:

左旋:以某個結(jié)點作為支點(旋轉(zhuǎn)結(jié)點),其右子結(jié)點變?yōu)樾D(zhuǎn)結(jié)點的父結(jié)點,右子結(jié)點的左子結(jié)點變?yōu)樾D(zhuǎn)結(jié)點的右子結(jié)點,左子結(jié)點保持不變。如圖 3。

右旋:以某個結(jié)點作為支點(旋轉(zhuǎn)結(jié)點),其左子結(jié)點變?yōu)樾D(zhuǎn)結(jié)點的父結(jié)點,左子結(jié)點的右子結(jié)點變?yōu)樾D(zhuǎn)結(jié)點的左子結(jié)點,右子結(jié)點保持不變。如圖 4。

變色:結(jié)點的顏色由紅變黑或由黑變紅。

圖 3:左旋

圖 4:右旋

上面所說的旋轉(zhuǎn)結(jié)點也即旋轉(zhuǎn)的支點,圖 4 和圖 5 中的 P 結(jié)點。我們先忽略顏色,可以看到旋轉(zhuǎn)操作不會影響旋轉(zhuǎn)結(jié)點的父結(jié)點,父結(jié)點以上的結(jié)構(gòu)還是保持不變的。

左旋只影響旋轉(zhuǎn)結(jié)點和其右子樹的結(jié)構(gòu),把右子樹的結(jié)點往左子樹挪了;右旋只影響旋轉(zhuǎn)結(jié)點和其左子樹的結(jié)構(gòu),把左子樹的結(jié)點往右子樹挪了。

所以旋轉(zhuǎn)操作是局部的。另外可以看出旋轉(zhuǎn)能保持紅黑樹平衡的一些端詳了:當(dāng)一邊子樹的結(jié)點少了,那么向另外一邊子樹“借”一些結(jié)點;當(dāng)一邊子樹的結(jié)點多了,那么向另外一邊子樹“租”一些結(jié)點。

但要保持紅黑樹的性質(zhì),結(jié)點不能亂挪,還得靠變色了。怎么變?具體情景有不同變法,后面會具體講到,現(xiàn)在只需要記住紅黑樹總是通過旋轉(zhuǎn)和變色達(dá)到自平衡。

Balabala 了這么多,相信你對紅黑樹有一定印象了,那么現(xiàn)在來考考你。

思考題 1:黑結(jié)點可以同時包含一個紅子結(jié)點和一個黑子結(jié)點嗎? (答案見文末)

接下來先講解紅黑樹的查找熱熱身。

紅黑樹查找

因為紅黑樹是一顆二叉平衡樹,并且查找不會破壞樹的平衡,所以查找跟二叉平衡樹的查找無異:

從根結(jié)點開始查找,把根結(jié)點設(shè)置為當(dāng)前結(jié)點。

  • 若當(dāng)前結(jié)點為空,返回 null。
  • 若當(dāng)前結(jié)點不為空,用當(dāng)前結(jié)點的 key 跟查找 key 作比較。
  • 若當(dāng)前結(jié)點 key 等于查找 key,那么該 key 就是查找目標(biāo),返回當(dāng)前結(jié)點。
  • 若當(dāng)前結(jié)點 key 大于查找 key,把當(dāng)前結(jié)點的左子結(jié)點設(shè)置為當(dāng)前結(jié)點,重復(fù)步驟 2。
  • 若當(dāng)前結(jié)點 key 小于查找 key,把當(dāng)前結(jié)點的右子結(jié)點設(shè)置為當(dāng)前結(jié)點,重復(fù)步驟 2。

如圖 5 所示:

圖 5:二叉樹查找流程圖

非常簡單,但簡單不代表它效率不好。正由于紅黑樹總保持黑色完美平衡,所以它的查找最壞時間復(fù)雜度為 O(2lgN),也即整顆樹剛好紅黑相隔的時候。

能有這么好的查找效率得益于紅黑樹自平衡的特性,而這背后的付出,紅黑樹的插入操作功不可沒。

紅黑樹插入

插入操作包括兩部分工作:一是查找插入的位置;二是插入后自平衡。

查找插入的父結(jié)點很簡單,跟查找操作區(qū)別不大:

  • 從根結(jié)點開始查找。
  • 若根結(jié)點為空,那么插入結(jié)點作為根結(jié)點,結(jié)束。
  • 若根結(jié)點不為空,那么把根結(jié)點作為當(dāng)前結(jié)點。
  • 若當(dāng)前結(jié)點為 null,返回當(dāng)前結(jié)點的父結(jié)點,結(jié)束。
  • 若當(dāng)前結(jié)點 key 等于查找 key,那么該 key 所在結(jié)點就是插入結(jié)點,更新結(jié)點的值,結(jié)束。
  • 若當(dāng)前結(jié)點 key 大于查找 key,把當(dāng)前結(jié)點的左子結(jié)點設(shè)置為當(dāng)前結(jié)點,重復(fù)步驟 4。
  • 若當(dāng)前結(jié)點 key 小于查找 key,把當(dāng)前結(jié)點的右子結(jié)點設(shè)置為當(dāng)前結(jié)點,重復(fù)步驟 4。

如圖 6 所示:

圖 6:紅黑樹插入位置查找

OK,插入位置已經(jīng)找到,把插入結(jié)點放到正確的位置就可以啦,但插入結(jié)點應(yīng)該是什么顏色呢?

答案是紅色。理由很簡單,紅色在父結(jié)點(如果存在)為黑色結(jié)點時,紅黑樹的黑色平衡沒被破壞,不需要做自平衡操作。

但如果插入結(jié)點是黑色,那么插入位置所在的子樹黑色結(jié)點總是多 1,必須做自平衡。

所有插入情景如圖 7 所示:


圖 7:紅黑樹插入情景

嗯,插入情景很多呢,8 種插入情景!但情景 1、2 和 3 的處理很簡單,而情景 4.2 和情景 4.3 只是方向反轉(zhuǎn)而已。

懂得了一種情景就能推出另外一種情景,所以總體來看,并不復(fù)雜,后續(xù)我們將一個一個情景來看,把它徹底搞懂。

另外,根據(jù)二叉樹的性質(zhì),除了情景 2,所有插入操作都是在葉子結(jié)點進(jìn)行的。這點應(yīng)該不難理解,因為查找插入位置時,我們就是在找子結(jié)點為空的父結(jié)點的。

在開始每個情景的講解前,我們還是先來約定下,如圖 8 所示:

圖 8:插入操作結(jié)點的叫法約定

圖 8 的字母并不代表結(jié)點 Key 的大小。I 表示插入結(jié)點,P 表示插入結(jié)點的父結(jié)點,S 表示插入結(jié)點的叔叔結(jié)點,PP 表示插入結(jié)點的祖父結(jié)點。

好了,下面讓我們一個一個來分析每個插入的情景以及處理。

情景 1:紅黑樹為空樹

最簡單的一種情景,直接把插入結(jié)點作為根結(jié)點就行,但注意,根據(jù)紅黑樹性質(zhì) 2:根節(jié)點是黑色。還需要把插入結(jié)點設(shè)為黑色。

處理:把插入結(jié)點作為根結(jié)點,并把結(jié)點設(shè)置為黑色。

情景 2:插入結(jié)點的 Key 已存在

插入結(jié)點的 Key 已存在,既然紅黑樹總保持平衡,在插入前紅黑樹已經(jīng)是平衡的,那么把插入結(jié)點設(shè)置為將要替代結(jié)點的顏色,再把結(jié)點的值更新就完成插入。

處理:把 I 設(shè)為當(dāng)前結(jié)點的顏色,更新當(dāng)前結(jié)點的值為插入結(jié)點的值。

情景 3:插入結(jié)點的父結(jié)點為黑結(jié)點

由于插入的結(jié)點是紅色的,當(dāng)插入結(jié)點是黑色時,并不會影響紅黑樹的平衡,直接插入即可,無需做自平衡。

處理:直接插入。

情景 4:插入結(jié)點的父結(jié)點為紅結(jié)點

再次回想下紅黑樹的性質(zhì) 2:根結(jié)點是黑色。如果插入的父結(jié)點為紅結(jié)點,那么該父結(jié)點不可能為根結(jié)點,所以插入結(jié)點總是存在祖父結(jié)點。這點很重要,因為后續(xù)的旋轉(zhuǎn)操作肯定需要祖父結(jié)點的參與。

情景 4 又分為很多子情景,下面將進(jìn)入重點部分,各位看官請留神了。

插入情景 4.1:叔叔結(jié)點存在并且為紅結(jié)點。

從紅黑樹性質(zhì) 4 可以,祖父結(jié)點肯定為黑結(jié)點,因為不可以同時存在兩個相連的紅結(jié)點。

那么此時該插入子樹的紅黑層數(shù)的情況是:黑紅紅。顯然最簡單的處理方式是把其改為:紅黑紅。如圖 9 和圖 10 所示。

處理:將 P 和 S 設(shè)置為黑色,將 PP 設(shè)置為紅色,把 PP 設(shè)置為當(dāng)前插入結(jié)點。

圖 9:插入情景 4.1_1

圖 10:插入情景 4.1_2

可以看到,我們把 PP 結(jié)點設(shè)為紅色了,如果 PP 的父結(jié)點是黑色,那么無需再做任何處理。

但如果 PP 的父結(jié)點是紅色,根據(jù)性質(zhì) 4,此時紅黑樹已不平衡了,所以還需要把 PP 當(dāng)作新的插入結(jié)點,繼續(xù)做插入操作自平衡處理,直到平衡為止。

試想下 PP 剛好為根結(jié)點時,那么根據(jù)性質(zhì) 2,我們必須把 PP 重新設(shè)為黑色,那么樹的紅黑結(jié)構(gòu)變?yōu)椋汉诤诩t。

換句話說,從根結(jié)點到葉子結(jié)點的路徑中,黑色結(jié)點增加了。這也是唯一一種會增加紅黑樹黑色結(jié)點層數(shù)的插入情景。

我們還可以總結(jié)出另外一個經(jīng)驗:紅黑樹的生長是自底向上的。這點不同于普通的二叉查找樹,普通的二叉查找樹的生長是自頂向下的。

插入情景 4.2:叔叔結(jié)點不存在或為黑結(jié)點,并且插入結(jié)點的父親結(jié)點是祖父結(jié)點的左子結(jié)點。

單純從插入前來看,也即不算情景 4.1 自底向上處理時的情況,叔叔結(jié)點非紅即為葉子結(jié)點(Nil)。

因為如果叔叔結(jié)點為黑結(jié)點,而父結(jié)點為紅結(jié)點,那么叔叔結(jié)點所在的子樹的黑色結(jié)點就比父結(jié)點所在子樹的多了,這不滿足紅黑樹的性質(zhì) 5。后續(xù)情景同樣如此,不再多做說明了。

前文說了,需要旋轉(zhuǎn)操作時,肯定一邊子樹的結(jié)點多了或少了,需要租或借給另一邊。插入顯然是多的情況,那么把多的結(jié)點租給另一邊子樹就可以了。

插入情景 4.2.1:插入結(jié)點是其父結(jié)點的左子結(jié)點。

處理:將 P 設(shè)為黑色,將 PP 設(shè)為紅色,對 PP 進(jìn)行右旋。

圖 11:插入情景 4.2.1

由圖 11 可得,左邊兩個紅結(jié)點,右邊不存在,那么一邊一個剛剛好,并且因為為紅色,肯定不會破壞樹的平衡。

咦,可以把 PP 設(shè)為紅色,I 和 P 設(shè)為黑色嗎?答案是可以!看過《算法:第 4 版》的同學(xué)可能知道,書中講解的就是把 PP 設(shè)為紅色,I 和 P 設(shè)為黑色。

但把 PP 設(shè)為紅色,顯然又會出現(xiàn)情景 4.1 的情況,需要自底向上處理,做多了無謂的操作,既然能自己消化就不要麻煩祖輩們啦。

插入情景 4.2.2:插入結(jié)點是其父結(jié)點的右子結(jié)點。

這種情景顯然可以轉(zhuǎn)換為情景 4.2.1,如圖 12 所示,不做過多說明了。


圖 12:插入情景 4.2.2

處理:對 P 進(jìn)行左旋,把 P 設(shè)置為插入結(jié)點,得到情景 4.2.1,進(jìn)行情景 4.2.1 的處理。

插入情景 4.3:叔叔結(jié)點不存在或為黑結(jié)點,并且插入結(jié)點的父親結(jié)點是祖父結(jié)點的右子結(jié)點。

該情景對應(yīng)情景 4.2,只是方向反轉(zhuǎn),不做過多說明了,直接看圖。

插入情景 4.3.1:插入結(jié)點是其父結(jié)點的右子結(jié)點。

圖 13:插入情景 4.3.1

處理:將 P 設(shè)為黑色,將 PP 設(shè)為紅色,對 PP 進(jìn)行左旋。

插入情景 4.3.2:插入結(jié)點是其父結(jié)點的右子結(jié)點。

圖 14:插入情景 4.3.2

處理:對 P 進(jìn)行右旋,把 P 設(shè)置為插入結(jié)點,得到情景 4.3.1,進(jìn)行情景 4.3.1 的處理。

好了,講完插入的所有情景了??赡苡型瑢W(xué)會想:上面的情景舉例的都是第一次插入而不包含自底向上處理的情況,那么上面所說的情景都適合自底向上的情況嗎?答案是肯定的。

理由很簡單,只要每棵子樹都能自平衡,那么整棵樹最終總是平衡的。好吧,在出個習(xí)題,請大家拿出筆和紙畫下試試(請務(wù)必動手畫下,加深印象)。

習(xí)題 1:請畫出圖 15 的插入自平衡處理過程。(答案見文末)

圖 15:習(xí)題 1

紅黑樹刪除

紅黑樹插入已經(jīng)夠復(fù)雜了,但刪除更復(fù)雜,也是紅黑樹最復(fù)雜的操作了。但穩(wěn)住,勝利的曙光就在前面了!

紅黑樹的刪除操作也包括兩部分工作:一是查找目標(biāo)結(jié)點;二是刪除后自平衡。

查找目標(biāo)結(jié)點顯然可以復(fù)用查找操作,當(dāng)不存在目標(biāo)結(jié)點時,忽略本次操作;當(dāng)存在目標(biāo)結(jié)點時,刪除后就得做自平衡處理了。

刪除了結(jié)點后,我們還需要找結(jié)點來替代刪除結(jié)點的位置,不然子樹跟父輩結(jié)點斷開了,除非刪除結(jié)點剛好沒子結(jié)點,那么就不需要替代。

二叉樹刪除結(jié)點找替代結(jié)點有 3 種情景:

  • 若刪除結(jié)點無子結(jié)點,直接刪除。
  • 若刪除結(jié)點只有一個子結(jié)點,用子結(jié)點替換刪除結(jié)點。
  • 若刪除結(jié)點有兩個子結(jié)點,用后繼結(jié)點(大于刪除結(jié)點的最小結(jié)點)替換刪除結(jié)點。

補充說明下,情景 3 的后繼結(jié)點是大于刪除結(jié)點的最小結(jié)點,也是刪除結(jié)點的右子樹中最右結(jié)點。

那么可以拿前繼結(jié)點(刪除結(jié)點的左子樹最左結(jié)點)替代嗎?可以的。但習(xí)慣上大多都是拿后繼結(jié)點來替代,后文的講解也是用后繼結(jié)點來替代。

另外告訴大家一種找前繼和后繼結(jié)點的直觀的方法(不知為何沒人提過,大家都知道?):把二叉樹所有結(jié)點投射在X軸上,所有結(jié)點都是從左到右排好序的,所有目標(biāo)結(jié)點的前后結(jié)點就是對應(yīng)前繼和后繼結(jié)點。

如圖 16 所示:

圖 16:二叉樹投射 x 軸后有序

接下來,講一個重要的思路:刪除結(jié)點被替代后,在不考慮結(jié)點的鍵值的情況下,對于樹來說,可以認(rèn)為刪除的是替代結(jié)點!話很蒼白,我們看圖 17。

圖 17:刪除結(jié)點換位思路

在不看鍵值對的情況下,圖 17 的紅黑樹最終結(jié)果是刪除了 Q 所在位置的結(jié)點!這種思路非常重要,大大簡化了后文講解紅黑樹刪除的情景!

基于此,上面所說的 3 種二叉樹的刪除情景可以相互轉(zhuǎn)換并且最終都是轉(zhuǎn)換為情景 1。

情景 2:刪除結(jié)點用其唯一的子結(jié)點替換,子結(jié)點替換為刪除結(jié)點后,可以認(rèn)為刪除的是子結(jié)點,若子結(jié)點又有兩個子結(jié)點,那么相當(dāng)于轉(zhuǎn)換為情景 3,一直自頂向下轉(zhuǎn)換,總是能轉(zhuǎn)換為情景 1。(對于紅黑樹來說,根據(jù)性質(zhì) 5.1,只存在一個子結(jié)點的結(jié)點肯定在樹末了)

情景 3:刪除結(jié)點用后繼結(jié)點(肯定不存在左結(jié)點),如果后繼結(jié)點有右子結(jié)點,那么相當(dāng)于轉(zhuǎn)換為情景 2,否則轉(zhuǎn)為情景 1。

二叉樹刪除結(jié)點情景關(guān)系圖如圖 18 所示:

圖 18:二叉樹刪除情景轉(zhuǎn)換

綜上所述,刪除操作刪除的結(jié)點可以看作刪除替代結(jié)點,而替代結(jié)點最后總是在樹末。

有了這結(jié)論,我們討論的刪除紅黑樹的情景就少了很多,因為我們只考慮刪除樹末結(jié)點的情景了。

同樣的,我們也是先來總體看下刪除操作的所有情景,如圖 19 所示:

圖 19:紅黑樹刪除情景

哈哈,是的,即使簡化了還是有 9 種情景!但跟插入操作一樣,存在左右對稱的情景,只是方向變了,沒有本質(zhì)區(qū)別。同樣的,我們還是來約定下,如圖 20 所示:

圖 20:刪除操作結(jié)點的叫法約定

圖 20 的字母并不代表結(jié)點 Key 的大小。R 表示替代結(jié)點,P 表示替代結(jié)點的父結(jié)點,S 表示替代結(jié)點的兄弟結(jié)點,SL 表示兄弟結(jié)點的左子結(jié)點,SR 表示兄弟結(jié)點的右子結(jié)點?;疑Y(jié)點表示它可以是紅色也可以是黑色。

值得特別提醒的是,R 是即將被替換到刪除結(jié)點的位置的替代結(jié)點,在刪除前,它還在原來所在位置參與樹的子平衡,平衡后再替換到刪除結(jié)點的位置,才算刪除完成。

萬事俱備,我們進(jìn)入最后的也是最難的講解。

刪除情景 1:替換結(jié)點是紅色結(jié)點。

我們把替換結(jié)點換到了刪除結(jié)點的位置時,由于替換結(jié)點是紅色,刪除了也不會影響紅黑樹的平衡,只要把替換結(jié)點的顏色設(shè)為刪除的結(jié)點的顏色即可重新平衡。

處理:顏色變?yōu)閯h除結(jié)點的顏色。

刪除情景 2:替換結(jié)點是黑結(jié)點。

當(dāng)替換結(jié)點是黑色時,我們就不得不進(jìn)行自平衡處理了。我們必須還得考慮替換結(jié)點是其父結(jié)點的左子結(jié)點還是右子結(jié)點,來做不同的旋轉(zhuǎn)操作,使樹重新平衡。

刪除情景 2.1:替換結(jié)點是其父結(jié)點的左子結(jié)點。

刪除情景 2.1.1:替換結(jié)點的兄弟結(jié)點是紅結(jié)點。

圖 21:刪除情景 2.1.1

若兄弟結(jié)點是紅結(jié)點,那么根據(jù)性質(zhì) 4,兄弟結(jié)點的父結(jié)點和子結(jié)點肯定為黑色,不會有其他子情景,我們按圖 21 處理,得到刪除情景 2.1.2.3(后續(xù)講解,這里先記住,此時 R 仍然是替代結(jié)點,它的新的兄弟結(jié)點 SL 和兄弟結(jié)點的子結(jié)點都是黑色)。

處理:將 S 設(shè)為黑色,將 P 設(shè)為紅色,對 P 進(jìn)行左旋,得到情景 2.1.2.3,進(jìn)行情景 2.1.2.3 的處理。

刪除情景 2.1.2:替換結(jié)點的兄弟結(jié)點是黑結(jié)點。

當(dāng)兄弟結(jié)點為黑色時,其父結(jié)點和子結(jié)點的具體顏色也無法確定(如果也不考慮自底向上的情況,子結(jié)點非紅即為葉子結(jié)點Nil,Nil結(jié)點為黑結(jié)點),此時又得考慮多種子情景。

刪除情景 2.1.2.1:替換結(jié)點的兄弟結(jié)點的右子結(jié)點是紅結(jié)點,左子結(jié)點任意顏色。

圖 22:刪除情景 2.1.2.1

即將刪除的左子樹的一個黑色結(jié)點,顯然左子樹的黑色結(jié)點少 1 了,然而右子樹又有紅色結(jié)點,那么我們直接向右子樹“借”個紅結(jié)點來補充黑結(jié)點就好啦,此時肯定需要用旋轉(zhuǎn)處理了,如圖 22 所示。

處理:將 S 的顏色設(shè)為 P 的顏色,將 P 設(shè)為黑色,將 SR 設(shè)為黑色,對 P 進(jìn)行左旋。

平衡后的圖怎么不滿足紅黑樹的性質(zhì)?前文提醒過,R 是即將替換的,它還參與樹的自平衡,平衡后再替換到刪除結(jié)點的位置,所以 R 最終可以看作是刪除的。

另外圖 2.1.2.1 是考慮到第一次替換和自底向上處理的情況,如果只考慮第一次替換的情況,根據(jù)紅黑樹性質(zhì),SL 肯定是紅色或為 Nil,所以最終結(jié)果樹是平衡的。

如果是自底向上處理的情況,同樣,每棵子樹都保持平衡狀態(tài),最終整棵樹肯定是平衡的。后續(xù)的情景同理,不做過多說明了。

刪除情景 2.1.2.2:替換結(jié)點的兄弟結(jié)點的右子結(jié)點為黑結(jié)點,左子結(jié)點為紅結(jié)點。

兄弟結(jié)點所在的子樹有紅結(jié)點,我們總是可以向兄弟子樹借個紅結(jié)點過來,顯然該情景可以轉(zhuǎn)換為情景 2.1.2.1。如圖 23 所示:

圖 23:刪除情景 2.1.2.2

處理:將 S 設(shè)為紅色,將 SL 設(shè)為黑色,對 S 進(jìn)行右旋,得到情景 2.1.2.1,進(jìn)行情景 2.1.2.1 的處理。

刪除情景 2.1.2.3:替換結(jié)點的兄弟結(jié)點的子結(jié)點都為黑結(jié)點。

好了,此次兄弟子樹都沒紅結(jié)點“借”了,兄弟幫忙不了,找父母唄,這種情景我們把兄弟結(jié)點設(shè)為紅色,再把父結(jié)點當(dāng)作替代結(jié)點,自底向上處理,去找父結(jié)點的兄弟結(jié)點去“借”。

但為什么需要把兄弟結(jié)點設(shè)為紅色呢?顯然是為了在 P 所在的子樹中保證平衡(R 即將刪除,少了一個黑色結(jié)點,子樹也需要少一個),后續(xù)的平衡工作交給父輩們考慮了,還是那句,當(dāng)每棵子樹都保持平衡時,最終整棵總是平衡的。

圖 24:情景 2.1.2.3

處理:將 S 設(shè)為紅色,把 P 作為新的替換結(jié)點,重新進(jìn)行刪除結(jié)點情景處理。

刪除情景 2.2:替換結(jié)點是其父結(jié)點的右子結(jié)點。

好啦,右邊的操作也是方向相反,不做過多說明了,相信理解了刪除情景 2.1 后,肯定可以理解 2.2。

刪除情景 2.2.1:替換結(jié)點的兄弟結(jié)點是紅結(jié)點。

圖 25:刪除情景 2.2.1

處理:將 S 設(shè)為黑色,將 P 設(shè)為紅色,對 P 進(jìn)行右旋,得到情景 2.2.2.3,進(jìn)行情景 2.2.2.3 的處理。

刪除情景 2.2.2:替換結(jié)點的兄弟結(jié)點是黑結(jié)點。

刪除情景 2.2.2.1:替換結(jié)點的兄弟結(jié)點的左子結(jié)點是紅結(jié)點,右子結(jié)點任意顏色。

圖 26:刪除情景 2.2.2.1

處理:將 S 的顏色設(shè)為 P 的顏色,將 P 設(shè)為黑色,將 SL 設(shè)為黑色,對 P 進(jìn)行右旋。

刪除情景 2.2.2.2:替換結(jié)點的兄弟結(jié)點的左子結(jié)點為黑結(jié)點,右子結(jié)點為紅結(jié)點。

圖 27:刪除情景 2.2.2.2

處理:將 S 設(shè)為紅色,將 SR 設(shè)為黑色,對 S 進(jìn)行左旋,得到情景 2.2.2.1,進(jìn)行情景 2.2.2.1 的處理。

刪除情景 2.2.2.3:替換結(jié)點的兄弟結(jié)點的子結(jié)點都為黑結(jié)點。

圖 28:刪除情景 2.2.2.3

處理:將 S 設(shè)為紅色,把 P 作為新的替換結(jié)點,重新進(jìn)行刪除結(jié)點情景處理。

綜上,紅黑樹刪除后自平衡的處理可以總結(jié)為:

自己能搞定的自消化(情景 1)

自己不能搞定的叫兄弟幫忙(除了情景 1、情景 2.1.2.3 和情景 2.2.2.3)

兄弟都幫忙不了的,通過父母,找遠(yuǎn)方親戚(情景2.1.2.3和情景2.2.2.3)

哈哈,是不是跟現(xiàn)實中很像,當(dāng)我們有困難時,首先先自己解決,自己無力了找兄弟姐妹幫忙,如果連兄弟姐妹都幫不上,再去找遠(yuǎn)方的親戚了。這樣記憶應(yīng)該會好記點~

最后再做個習(xí)題加深理解(請不熟悉的同學(xué)務(wù)必動手畫下)。

習(xí)題 2:請畫出圖 29 的刪除自平衡處理過程。

習(xí)題 2

寫在后面

相信看了這篇文章后,再去看 Java 和 HashMap 和 TreeMap 的源碼絕對沒難度!最后來看下思考題和習(xí)題的答案吧。

思考題 1:黑結(jié)點可以同時包含一個紅子結(jié)點和一個黑子結(jié)點嗎?

答:可以。如下圖的 F 結(jié)點:

習(xí)題 1:請畫出圖 15 的插入自平衡處理過程。

答案如下圖:

習(xí)題 2:請畫出圖 29 的刪除自平衡處理過程。

答案如下圖:

 

 

責(zé)任編輯:武曉燕 來源: 簡書
相關(guān)推薦

2018-11-21 15:40:08

HTTP協(xié)議前端

2020-10-09 06:56:55

紅黑樹動圖二叉樹

2019-09-05 11:14:12

監(jiān)控系統(tǒng)拓?fù)鋱D

2022-07-04 08:31:42

GitOpsGit基礎(chǔ)設(shè)施

2019-12-27 09:47:05

大數(shù)據(jù)TomcatWeb

2019-10-08 10:10:52

中臺 IT后臺

2020-12-01 09:03:22

分庫分表MySQL

2020-01-21 10:16:15

Kubernetes教程容器

2018-11-21 09:40:57

熔斷實踐AOP

2020-09-28 14:25:39

HTTPS加密算法

2021-09-27 13:50:13

Python裝飾器函數(shù)

2020-06-22 08:07:48

Spring依賴場景

2020-09-17 07:37:09

紅黑樹數(shù)據(jù)結(jié)構(gòu)

2023-01-26 00:22:01

分布式架構(gòu)大文件

2021-09-01 10:13:07

數(shù)據(jù)庫面試節(jié)點

2020-09-08 06:30:59

微服務(wù)代碼模塊

2017-02-22 15:04:52

2018-11-19 08:34:22

Hadoop架構(gòu)HDFS

2022-02-28 11:10:42

ZGCG1收集器

2020-03-31 10:36:07

數(shù)據(jù)平臺架構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號

国产一区二区三区四区大秀| 日本视频在线免费观看| 欧美视频网站| 精品国产一二三区| 久久久久久久久久久视频| 青青草av免费在线观看| 人人爽香蕉精品| 欧美成人激情图片网| 日韩少妇一区二区| 88xx成人永久免费观看| 亚洲人妖av一区二区| 久久久久久高清| 91久久精品国产91性色69| 午夜精品网站| 国产亚洲a∨片在线观看| 一级黄色免费毛片| 免费观看成人性生生活片| 亚洲欧美日韩成人高清在线一区| 久久精品日产第一区二区三区| 中文字幕1区2区3区| 亚洲图片在线| 精品国内自产拍在线观看| 国产又粗又长又爽| 亚洲一区二区三区免费| 欧美色区777第一页| 久久久亚洲精品无码| jizz性欧美| 中文字幕精品一区| 精品国产乱码久久久久久久软件| 97精品人妻一区二区三区| 美女被久久久| 97在线观看视频国产| avove在线播放| 欧美综合久久| 亚洲人成啪啪网站| 亚洲调教欧美在线| 亚洲国产高清在线观看| 欧美少妇一区二区| 91蝌蚪视频在线观看| av在线不卡免费| 亚洲一区二区三区四区在线观看| 91手机视频在线| 午夜视频在线观看网站| 狠狠色综合色综合网络| 国产精品av网站| 日韩 国产 欧美| 日韩经典中文字幕一区| 欧美尤物巨大精品爽| 黄色片视频网站| 亚洲裸体俱乐部裸体舞表演av| 欧美日韩成人在线观看| 少妇久久久久久被弄高潮| 中出一区二区| 欧美人与性动交| 清纯粉嫩极品夜夜嗨av| 欧美fxxxxxx另类| 欧美成人全部免费| 亚洲天堂黄色片| 一区二区三区四区日韩| 久久偷看各类女兵18女厕嘘嘘 | 日韩av片在线播放| 午夜精品999| 欧美黑人又粗大| 国产无遮挡免费视频| 在线观看不卡| 国产91精品高潮白浆喷水| 日产精品久久久| 久久一二三四| 国产在线精品成人一区二区三区| 97人人爽人人爽人人爽| 国产精品99久久久久久似苏梦涵| av在线不卡观看| 天天射天天色天天干| 91污在线观看| 午夜精品电影在线观看| 久做在线视频免费观看| 一区二区在线观看视频| 五十路熟女丰满大屁股| 欧美舌奴丨vk视频| 欧美美女一区二区三区| 久久久久亚洲av无码麻豆| 国产主播性色av福利精品一区| 日韩成人在线视频网站| 日本乱子伦xxxx| 97久久视频| 久久久久久久久久久91| www.欧美色| 国产在线精品一区二区不卡了| 97人人模人人爽人人少妇| 台湾av在线二三区观看| 中文字幕中文乱码欧美一区二区| 9191国产视频| 成人软件在线观看| 日韩三级视频在线看| 亚洲国产欧美视频| 天天影视综合| 5278欧美一区二区三区| 亚洲无码精品国产| aaa欧美色吧激情视频| 午夜精品福利一区二区| 国产亚洲成av人片在线观看| 欧美日韩亚洲综合| 成人在线视频免费播放| 欧美oldwomenvideos| 97精品在线视频| 97人人爽人人爽人人爽| 91啦中文在线观看| 日本中文字幕一级片| 素人啪啪色综合| 亚洲国产日韩一区| 中文字幕美女视频| 久久亚洲图片| 国产精品9999久久久久仙踪林| а天堂8中文最新版在线官网| 亚洲视频狠狠干| 欧美日韩一区二区在线免费观看| 国产精品久久久久久久久久久久久久久| 日韩麻豆第一页| 男女免费视频网站| 久热成人在线视频| 日本一区不卡| av影片在线| 欧美一级精品大片| 美国黄色特级片| 亚洲欧美日韩精品一区二区| 亚洲自拍偷拍第一页| 成人影视在线播放| 色综合天天综合| 手机在线看片日韩| 激情久久久久久| 91色视频在线观看| 五月天婷婷在线视频| 色哟哟在线观看一区二区三区| 美女又黄又免费的视频| 国产高清久久| 国产欧美一区二区三区四区| 国产在线视频你懂得| 欧美午夜激情视频| 素人fc2av清纯18岁| 亚洲国产导航| 国产精品日韩一区二区 | 亚洲97在线观看| 亚洲第一视频在线播放| 一区二区三区在线观看网站| www.久久91| 日韩国产综合| 国产区精品在线观看| 成人在线二区| 欧美人动与zoxxxx乱| 九一在线免费观看| 免费人成网站在线观看欧美高清| 久久精品视频99| 久久久蜜桃一区二区| 99riav一区二区三区| 欧美视频在线观看视频| 99这里只有精品视频| 精品中文字幕在线| 黑人精品一区二区三区| 亚洲国产中文字幕在线视频综合| 中文字幕99页| av成人国产| 欧美极品一区| 97精品国产综合久久久动漫日韩| 在线观看日韩欧美| 91禁在线观看| 亚洲欧美另类图片小说| 波多野结衣三级视频| 亚洲第一伊人| 欧美色欧美亚洲另类七区| 免费福利视频一区二区三区| 亚洲无限av看| 亚洲网站免费观看| 一区二区欧美精品| 亚洲精品中文字幕在线播放| 丝袜美腿亚洲综合| 亚洲资源在线网| 91成人福利| 97视频在线观看免费高清完整版在线观看| 五月婷婷狠狠干| 在线观看欧美精品| 我要看一级黄色录像| 国产高清视频一区| 日韩av资源在线| 久久蜜桃av| 国产视频在线观看一区| 欧美大片高清| 另类天堂视频在线观看| 无码国产精品高潮久久99| 日韩欧美在线播放| 亚洲怡红院在线观看| 成人手机在线视频| 五月婷婷激情久久| 欧美成人高清| 日本成人看片网址| 久久丁香四色| 日韩av成人在线观看| 国产激情在线| 亚洲欧美日本精品| 99视频国产精品免费观看a | 中文字幕一区二区人妻电影| 国产精品第四页| 亚洲久久久久久| 国内精品自线一区二区三区视频| www精品久久| 午夜激情久久| 美女一区视频| 18国产精品| 国产精品一区久久| 国产一二三在线| 欧美插天视频在线播放| 黄色在线观看网| 精品久久99ma| 国产精品久久免费| 色婷婷亚洲综合| 日韩和一区二区| 亚洲欧美日韩国产另类专区| 99久久久无码国产精品衣服| 粉嫩嫩av羞羞动漫久久久 | 日韩精品视频三区| www.成人精品| 欧美色大人视频| 黄色在线免费观看| 亚洲福利视频导航| www欧美com| 国产精品麻豆视频| www.中文字幕av| 成人午夜在线视频| 日批视频在线看| 免费在线观看成人| av无码精品一区二区三区| 亚洲区欧美区| www.xxx麻豆| 欧美黄色aaaa| 国产又粗又大又爽的视频| 欧美综合另类| 相泽南亚洲一区二区在线播放| 亚洲黄色录像| 久久国产精品-国产精品| 亚洲伊人影院| 国产精品久久7| 视频二区欧美毛片免费观看| 国产综合久久久久| 欧美a一级片| 国产一区玩具在线观看| av在线一区不卡| 国产精品久久久久久超碰| 超碰一区二区| 日韩美女在线播放| 卡通欧美亚洲| 国产精品流白浆视频| www.国产精品| 国产精品一区二区久久精品 | 激情综合在线| 久久人人爽人人爽人人av| 欧美日韩p片| 妞干网视频在线观看| 国户精品久久久久久久久久久不卡| 欧美一级爱爱视频| 黄色亚洲大片免费在线观看| 亚洲国产精品成人天堂| 亚洲精品精选| 国产淫片免费看| 久久亚洲二区| 超碰成人在线播放| 国产福利视频一区二区三区| 香蕉视频污视频| 国产日韩欧美不卡| 日韩欧美在线视频播放| 亚洲免费看黄网站| 国产在线视频卡一卡二| 欧美日韩一区二区在线| 波多野结衣不卡| 欧美精品在线观看播放| 亚洲黄色a级片| 亚洲精品mp4| 国产二区视频在线观看| 久久精品国产v日韩v亚洲| 日本h片在线观看| 欧美在线精品免播放器视频| 国产成人免费| 7777奇米亚洲综合久久| 亲子伦视频一区二区三区| 日本不卡高清视频一区| 一区二区三区午夜探花| 男女视频网站在线观看| 日本中文字幕不卡| 中文字幕一区二区三区人妻在线视频 | 国产欧美日韩精品一区二区免费| 亚洲在线观看一区| 亚洲国产日韩在线| 高清一区在线观看| 国产91高潮流白浆在线麻豆| 国产精品无码午夜福利| 亚洲欧美激情一区二区| av中文在线播放| 7777精品伊人久久久大香线蕉完整版| 亚洲免费国产视频| 最近中文字幕2019免费| xxxcom在线观看| 国产免费一区二区三区在线观看 | 亚洲男人天堂视频| av片在线观看永久免费| 日韩av不卡在线| 丁香婷婷成人| 欧美h视频在线观看| 麻豆成人精品| 无码国产69精品久久久久网站| 国产精品久久99| 国产成人亚洲欧洲在线| 正在播放一区二区| 国产女主播在线直播| 国产做受高潮69| www.久久久久爱免| 日韩国产精品一区二区三区| 激情综合电影网| av在线网站免费观看| 国产日韩欧美激情| 天堂中文字幕在线观看| 日韩一区二区三区免费观看| 高清毛片在线看| 欧美一区二区三区图| 亚洲成人偷拍| 老司机午夜网站| 久久99精品网久久| 精品无码在线观看| 黑人巨大精品欧美一区二区免费| 精品免费久久久| 精品国产美女在线| 韩国成人在线| 日韩欧美视频一区二区| 久久aⅴ乱码一区二区三区| aaaa黄色片| 亚洲国产欧美日韩另类综合 | 一本色道久久综合亚洲精品小说 | 男人操女人动态图| 精品久久久一区| 韩国av在线免费观看| 欧美肥婆姓交大片| 日本一区二区乱| 99re6这里有精品热视频| 国产一区二区三区免费观看 | 婷婷久久综合九色综合绿巨人| 国产黄频在线观看| 免费91麻豆精品国产自产在线观看| 欧美jizz18| 艳母动漫在线免费观看| 激情丁香综合五月| 精品国产乱码久久久久久鸭王1| 欧美一区中文字幕| av在线app| 97视频中文字幕| 激情欧美国产欧美| 香蕉视频污视频| 欧美日韩国产一区二区| 色视频在线观看福利| 欧美一级黄色网| 蜜臀av免费一区二区三区| 少妇性l交大片| 国产精品亲子伦对白| 一区二区三区黄色片| www.亚洲免费视频| 九九九九九九精品任你躁| 99热这里只有精品免费| av在线不卡免费看| 黄色片中文字幕| 在线精品高清中文字幕| 91精品国产自产观看在线| 水蜜桃在线免费观看| 成人动漫在线一区| 国产一级一级国产| 日韩在线视频免费观看| 欧美.com| 国产91在线免费| 国产精品久久午夜| 亚洲av无码一区二区乱子伦| 91精品国产91久久久久久久久| 日韩高清一级| 中文字幕天天干| 一二三四区精品视频| 亚洲av片一区二区三区| 国产精品mp4| 在线一区电影| 熟女丰满老熟女熟妇| 欧美日韩一区二区三区高清| av毛片在线免费看| 裸体丰满少妇做受久久99精品| 美女视频一区二区三区| 久久久久久久久久久97| 精品视频在线播放| 国产 日韩 欧美| 久久网站免费视频| 亚洲色图欧美在线| 青青青草原在线| 91精品视频网站| 久久久久久久欧美精品| 国产少妇在线观看| 亚洲天堂av综合网| 亚洲天堂中文字幕在线观看| av网站在线不卡| 午夜视频在线观看一区二区三区|