面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

紅黑樹是一個平衡的二叉樹,但不是一個完美的平衡二叉樹。雖然咱們但願一個全部查找都能在~lgN次比較內結束,可是這樣在動態插入中保持樹的完美平衡代價過高,因此,咱們稍微放鬆逛一下限制,但願找到一個能在對數時間內完成查找的數據結構。這個時候,紅黑樹站了出來。

閱讀如下須要瞭解普通二叉樹的插入以及刪除操做。面試

紅黑樹是在普通二叉樹上,對沒個節點添加一個顏色屬性造成的,同時整個紅黑二叉樹須要同時知足一下五條性質算法

紅黑樹須要知足的五條性質:數據結構

性質一:節點是紅色或者是黑色;

在樹裏面的節點不是紅色的就是黑色的,沒有其餘顏色,要不怎麼叫紅黑樹呢,是吧。ide

性質二:根節點是黑色;

根節點老是黑色的。它不能爲紅。性能

性質三:每一個葉節點(NIL或空節點)是黑色;

這個可能有點理解困難,能夠看圖:3d

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

這個圖片就是一個紅黑樹,NIL節點是個空節點,而且是黑色的。blog

性質四:每一個紅色節點的兩個子節點都是黑色的(也就是說不存在兩個連續的紅色節點);

就是連續的兩個節點不能是連續的紅色,連續的兩個節點的意思就是父節點與子節點不能是連續的紅色。圖片

性質五:從任一節點到其沒個葉節點的全部路徑都包含相同數目的黑色節點;

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

從上圖能夠看見相同數量的黑色節點有三個;it

當咱們進行插入或者刪除操做時所做的一切操做都是爲了調整樹使之符合這五條性質。class

下面咱們先介紹兩個基本操做,旋轉。

旋轉的目的是將節點多的一支出讓節點給另外一個節點少的一支,旋轉操做在插入和刪除操做中常常會用到,因此要熟記。

下面是左旋和右旋:

左旋:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

右旋:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

插入

下面講講插入

咱們先明確一下各節點的叫法
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

由於要知足紅黑樹的這五條性質,若是咱們插入的是黑色節點,那就違反了性質五,須要進行大規模調整,若是咱們插入的是紅色節點,那就只有在要插入節點的父節點也是紅色的時候違反性質四或者是當插入的節點是根節點時,違反性質二,因此,咱們把要插入的節點的顏色變成紅色。

下面是可能遇到的插入的幾種情況:

一、當插入的節點是根節點時,直接塗黑便可;

二、當要插入的節點的父節點是黑色的時候。
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

這個時候插入一個紅色的節點並無對這五個性質產生破壞。因此直接插入不用在進行調整操做。

三、若是要插入的節點的父節點是紅色且父節點是祖父節點的左支的時候。

這個要分兩種狀況,一種是叔叔節點爲黑的狀況,一種是叔叔節點爲紅的狀況。

當叔叔爲黑時,也分爲兩種狀況,一種是要插入的節點是父節點的左支,另外一種是要插入的節點是父親的右支。

咱們先看一下當要插入的節點是父節點的左支的狀況:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

這個時候違反了性質四,咱們就須要進行調整操做,使之符合性質四,咱們能夠經過對祖父節點進行右旋同時將祖父節點和父節點的顏色進行互換,這樣就變成了:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

通過這樣的調整能夠符合性質四而且不對其餘性質產生破壞。

當插入的節點是父節點的右支的時候:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

當要插入的節點是父節點的右支的時候,咱們能夠先對父節點進行左旋,變成以下:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

若是咱們把原先的父節點看作是新的要插入的節點,把原先要插入的節點看作是新的父節點,那就變成了當要插入的節點在父節點的左支的狀況,對,是的,就是按照當要插入的節點在父節點的左支的狀況進行旋轉,旋轉完以後變成以下:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

四、若是要插入的節點的父節點是紅色且父節點是祖父節點的右支的時候;

這個時候的狀況跟狀況3所表述的狀況是一個鏡像,將狀況3的左和右互換一下就能夠了。

五、若是要插入的節點的父節點是紅色而且叔叔節點也爲紅色,以下:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

這個時候,只需將父親節點和叔叔節點塗黑,將祖父節點塗紅。

以上就是插入的所有過程。

刪除

首先你要了解普通二叉樹的刪除操做:

一、若是刪除的是葉節點,能夠直接刪除;

二、若是被刪除的元素有一個子節點,能夠將子節點直接移到被刪除元素的位置;

三、若是有兩個子節點,這時候就能夠把被刪除元素的右支的最小節點(被刪除元素右支的最左邊的節點)和被刪除元素互換,咱們把被刪除元素右支的最左邊的節點稱之爲後繼節點(後繼元素),而後在根據狀況1或者狀況2進行操做。如圖:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

將被刪除元素與其右支的最小元素互換,變成以下圖所示:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

而後再將被刪除元素刪除:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

咱們下面所稱的被刪除元素,皆是指已經互換以後的被刪除元素。

加入顏色以後,被刪除元素和後繼元素互換隻是值得互換,並不互換顏色,這個要注意。

下面開始講一下紅黑樹刪除的規則:

一、當被刪除元素爲紅時,對五條性質沒有什麼影響,直接刪除。

二、當被刪除元素爲黑且爲根節點時,直接刪除。

三、當被刪除元素爲黑,且有一個右子節點爲紅時,將右子節點塗黑放到被刪除元素的位置,如圖:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

變成
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

四、當被刪除元素爲黑,且兄弟節點爲黑,兄弟節點兩個孩子也爲黑,父節點爲紅,此時,交換兄弟節點與父節點的顏色;NIL元素是指每一個葉節點都有兩個空的,顏色爲黑的NIL元素,須要他的時候就能夠把它當作兩個黑元素,不須要的時候能夠忽視他。

如圖:


面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

變成:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

五、當被刪除元素爲黑、而且爲父節點的左支,且兄弟顏色爲黑,兄弟的右支爲紅色,這個時候須要交換兄弟與父親的顏色,並把父親塗黑、兄弟的右支塗黑,並以父節點爲中心左轉。如圖:

由:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

變成:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

六、當被刪除元素爲黑、而且爲父節點的左支,且兄弟顏色爲黑,兄弟的左支爲紅色,這個時候須要先把兄弟與兄弟的左子節點顏色互換,進行右轉,而後就變成了規則5同樣了,在按照規則5進行旋轉。如圖:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

先兄弟與兄弟的左子節點顏色互換,進行右轉,變成:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

而後在按照規則5進行旋轉,變成:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

七、當被刪除元素爲黑且爲父元素的右支時,跟狀況5.狀況6 互爲鏡像。

八、被刪除元素爲黑且兄弟節點爲黑,兄弟節點的孩子爲黑,父親爲黑,這個時候須要將兄弟節點變爲紅,再把父親看作那個被刪除的元素(只是看作,實際上不刪除),看看父親符和哪一條刪除規則,進行處理變化如圖:

由:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

變成:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

九、當被刪除的元素爲黑,且爲父元素的左支,兄弟節點爲紅色的時候,須要交換兄弟節點與父親結點的顏色,以父親結點進行左旋,就變成了狀況4,在按照狀況四進行操做便可,變化以下:

由:

面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

交換兄弟節點與父親結點的顏色,以父親結點進行左旋 變成:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

在按照狀況四進行操做,變成:
面試阿里,字節跳動,美團必被問到的紅黑樹原來這麼簡單

好了,刪除的步驟也講完,沒有講到的一點就是,在添加刪除的時候,時刻要記得更改根元素的顏色爲黑。

這裏並無語言實現,只是講了一下紅黑樹的插入刪除步驟,你能夠根據步驟本身把紅黑樹實現

點擊這裏,照着規則一步一步的構建一個紅黑樹吧。

最後

一、紅黑樹的實現實際上是一個二、三、4樹,只是將雙節點或者三節點用紅色進行了標示,若是你將紅色節點放到和它父元素相同的高度,並把它和父元素看作是一個元素,你就會發現,變成了一個高度爲lgN的二叉樹,這個2.3.4樹對紅黑樹頗有啓發意義。

二、上面的步驟其實能夠不用死記硬背,是能夠推導出來的,由於咱們是把一個平衡但經過插入或者刪除破壞了平衡的紅黑樹再次平衡,同過旋轉讓位,改變紅黑顏色,使之符合那五條基本性質。好比遇到刪除操做狀況四的時候,咱們能夠把那個刪除元素去除,發現左邊比右邊少一個黑元素,這個時候,怎麼辦,咱們發現兄弟節點的子元素有一個紅元素,操做這個不會影響那五條性質,因此咱們經過變換顏色,旋轉,便可讓左右兩邊的的黑色數目同樣。

三、旋轉操做的目的是出讓一個元素到另外的地方而且符合二叉樹左小右大的性質,交換顏色的目的是爲了保持紅黑樹的那五條性質。

四、要時刻記得 ,一切的操做都是爲了保持那五條性質。

最後的最後,其實還有一種更爲簡單的紅黑二叉樹,這個簡單的紅黑二叉樹其實是一個2.3樹,他只容許左節點爲紅節點,可是性能上確定是不如這個紅黑樹。這個簡單的紅黑二叉樹在《算法》第四版有介紹,掌握完以後再看這個簡單的紅黑二叉樹,就會覺着簡單 easy。

最後的最後的最後,必定要嘗試着本身推導一下插入刪除規則啊,否則常常忘,是睡一覺起來再看就有點懵逼的那種忘。

相關文章
相關標籤/搜索