日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

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

二叉查找樹(shù)

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

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

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

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

我們來(lái)看下圖的這棵樹(shù),他就是典型的二叉查找樹(shù)

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

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

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

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

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

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

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

我們依次插入5個(gè)節(jié)點(diǎn):7,6,5,4,3,??聪聢D插入之后的圖:

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

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

?

紅黑樹(shù)

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

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

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

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

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

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

下圖就是一個(gè)典型的紅黑樹(shù):

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

?

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

1,我們看下圖:

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

?

2,向原樹(shù)插入21呢?,看下圖:

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

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

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

【變色】:

為了符合紅黑樹(shù)的規(guī)則,會(huì)把節(jié)點(diǎn)紅變黑或者黑變紅。下圖展示的是紅黑樹(shù)的部分,需要注意節(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又是兩個(gè)連續(xù)的紅色節(jié)點(diǎn)(規(guī)則4),所以需要將27紅變黑。

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

【左旋轉(zhuǎn)】

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

【右旋轉(zhuǎn)】

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

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

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

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

由于17和25是連續(xù)的兩個(gè)紅色節(jié)點(diǎn),那么吧節(jié)點(diǎn)17變黑嗎?這樣是不行的,你想這樣一來(lái)不就打破了規(guī)則4了嗎,而且根據(jù)規(guī)則2,也不可能吧13變成紅色。變色已經(jīng)無(wú)法解決問(wèn)題了,所以只能進(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)個(gè)數(shù)不是3,是4不符合規(guī)則。

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

?

?

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

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

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

TODO 待思考

總結(jié):

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

總結(jié)

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

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