日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

五分钟搞懂什么是红黑树(全程图解)

發(fā)布時間:2024/1/8 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五分钟搞懂什么是红黑树(全程图解) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

紅黑樹(又叫平衡二叉樹),對很多童鞋來說,是既熟悉又陌生。熟悉是因?yàn)樵谛W(xué)習(xí)期間,準(zhǔn)備面試時,這是重點(diǎn)。然后經(jīng)過多年的荒廢,如今已經(jīng)忘記的差不多了。如果正在看文章的你,馬上快要畢業(yè),面臨著找工作的壓力;又或者你覺得需要將這塊知識重新復(fù)習(xí)一遍;又或者只是看看,那么恭喜你,賺到了。那么我將帶領(lǐng)大家重新認(rèn)識下紅黑樹,用簡單的語言,搞懂紅黑樹。

在學(xué)習(xí)紅黑樹之前,咱們需要先來理解下二叉查找樹(BST)。

二叉查找樹

要想了解二叉查找樹,我們首先看下二叉查找樹有哪些特性呢?

1, 左子樹上所有的節(jié)點(diǎn)的值均小于或等于他的根節(jié)點(diǎn)的值

2, 右子數(shù)上所有的節(jié)點(diǎn)的值均大于或等于他的根節(jié)點(diǎn)的值

3, 左右子樹也一定分別為二叉排序樹

我們來看下圖的這棵樹,他就是典型的二叉查找樹

那問題來了,為什么一定要這種結(jié)構(gòu)呢?換句話說這樣的結(jié)構(gòu)有什么好處呢?我們就來查找下值為10的節(jié)點(diǎn)。它怎么一步步的找到這個節(jié)點(diǎn)的?步驟是怎樣的?接著往下看。

1, 查找到根節(jié)點(diǎn)9,看下圖:

2, 由于10大于9的,所以查找到右孩子13,看下圖:

3, 又因?yàn)?0是小與13的,所以查找到左孩子11,看下圖:

4, 這一步相比不用說了大家也都知道了,找到了左孩子,然后發(fā)現(xiàn)正好是10 。恰好是正要尋找的值。

可能又有童鞋會問,這不是二分查找的思想嗎?確實(shí),查找所需的最大次數(shù)等同于二叉查找樹的高度。當(dāng)然在插入節(jié)點(diǎn)的時候,也是這種思想,一層一層的找到合適的位置插入。但是二叉查找樹有個比較大的缺陷,而且這個缺陷會影響到他的性能。我們先來看下有一種情況的插入操作:

如果初始的二叉查找樹只有三個節(jié)點(diǎn),如下圖:

我們依次插入5個節(jié)點(diǎn):7,6,5,4,3,。看下圖插入之后的圖:

看出來了嗎?有沒有覺得很別扭,如果根節(jié)點(diǎn)足夠大,那是不是“左腿”會變的特別長,也就是說查找的性能大打折扣,幾乎就是線性查找了。

那有沒有好的辦法解決這個問題呢?解決這種多次插入新節(jié)點(diǎn)而導(dǎo)致的不平衡?這個時候紅黑樹就登場了。

?

紅黑樹

紅黑樹就是一種平衡的二叉查找樹,說他平衡的意思是他不會變成“瘸子”,左腿特別長或者右腿特別長。除了符合二叉查找樹的特性之外,還具體下列的特性:

1. 節(jié)點(diǎn)是紅色或者黑色

2. 根節(jié)點(diǎn)是黑色

3. 每個葉子的節(jié)點(diǎn)都是黑色的空節(jié)點(diǎn)(NULL)

4. 每個紅色節(jié)點(diǎn)的兩個子節(jié)點(diǎn)都是黑色的。(相互連接的兩個非葉子節(jié)點(diǎn),是一紅一黑的?

5. 從任意節(jié)點(diǎn)到其每個葉子的所有路徑都包含相同的黑色節(jié)點(diǎn)。

下圖就是一個典型的紅黑樹:

很多童鞋又會驚訝了,天啊這個條條框框也太多了吧。沒錯,正式因?yàn)檫@些規(guī)則,才能保證紅黑樹的自平衡。最長路徑不超過最短路徑的2倍。

?

當(dāng)插入和刪除節(jié)點(diǎn),就會對平衡造成破壞,這時候需要對樹進(jìn)行調(diào)整,從而重新達(dá)到平衡。那什么情況下會破壞紅黑樹的規(guī)則呢?

1,我們看下圖:

向原來的紅黑樹插入值為14的新節(jié)點(diǎn),由于父節(jié)點(diǎn)15是黑色節(jié)點(diǎn),所以這種情況沒有破壞結(jié)構(gòu),不需要做任何的改變。

?

2,向原樹插入21呢?,看下圖:

由于父節(jié)點(diǎn)22是紅色節(jié)點(diǎn),因此這種情況打破了紅黑樹的規(guī)則4,必須作出調(diào)整。那么究竟該怎么調(diào)整呢?有兩種方式【變色】

【旋轉(zhuǎn)】分為【左旋轉(zhuǎn)】和【右旋轉(zhuǎn)】。

為了保持平衡二叉樹的結(jié)構(gòu),有時候需要兩種方式結(jié)合使用。而左旋轉(zhuǎn)和右旋轉(zhuǎn)需要根據(jù)實(shí)際情況選擇使用哪種。

【變色】:

為了符合紅黑樹的規(guī)則,會把節(jié)點(diǎn)紅變黑或者黑變紅。下圖展示的是紅黑樹的部分,需要注意節(jié)點(diǎn)25并非根節(jié)點(diǎn)。因?yàn)?1和22鏈接出現(xiàn)紅色,不符合規(guī)則4,所以把22紅變黑:

但這樣還是不符合規(guī)則5,所以需要把25黑變紅,看下圖:

你以為現(xiàn)在結(jié)束了?天真,因?yàn)?5和27又是兩個連續(xù)的紅色節(jié)點(diǎn)(規(guī)則4),所以需要將27紅變黑。

終于結(jié)束了,都滿足規(guī)則了,舒服多了。

【左旋轉(zhuǎn)】

也就是逆時針旋轉(zhuǎn)兩個節(jié)點(diǎn),使父節(jié)點(diǎn)被自己的右孩子取代,而自己成為自己的左孩子,聽起來嚇?biāo)廊?#xff0c;直接看圖吧:

【右旋轉(zhuǎn)】

順時針旋轉(zhuǎn)兩個節(jié)點(diǎn),使得自己的父節(jié)點(diǎn)被左孩子取代,而自己成為自己的右孩子,看不懂直接看圖吧:

看起來這么復(fù)雜,到底怎么用呢?確實(shí)很復(fù)雜,我們講下典型的例子,大家參考下:

以剛才插入21節(jié)點(diǎn)的例子:

首先我們需要做的是變色,把節(jié)點(diǎn)25以及下方的節(jié)點(diǎn)變色:

由于17和25是連續(xù)的兩個紅色節(jié)點(diǎn),那么吧節(jié)點(diǎn)17變黑嗎?這樣是不行的,你想這樣一來不就打破了規(guī)則4了嗎,而且根據(jù)規(guī)則2,也不可能吧13變成紅色。變色已經(jīng)無法解決問題了,所以只能進(jìn)行旋轉(zhuǎn)了。13當(dāng)成X,17當(dāng)成Y,左旋轉(zhuǎn)試試看:

?

?

由于根節(jié)點(diǎn)必須是黑色,所以需要變色,結(jié)果如下圖:

繼續(xù),其中有兩條路徑(17-)8->6->NULL)的黑色節(jié)點(diǎn)個數(shù)不是3,是4不符合規(guī)則。

這個時候需要把13當(dāng)做X,8當(dāng)做Y,進(jìn)行右旋轉(zhuǎn):

?

?

最后根據(jù)規(guī)則變色:

這樣一來,我們終于結(jié)束了,經(jīng)過調(diào)整之后符合規(guī)則。

那我們費(fèi)這么大力氣,這么復(fù)雜,這東西用在哪里,有哪些應(yīng)用呢?

TODO 待思考

總結(jié):

紅黑色的大體思想就是上面描述的那樣,里面還有很多情況要考慮,本文只是簡單的講述思想,大家有興趣可以去百度上看各種情況的考慮。謝謝大家的支持!

總結(jié)

以上是生活随笔為你收集整理的五分钟搞懂什么是红黑树(全程图解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。