核心思想:紅黑樹的紅色節點上移到父親節點就變成了一顆234樹。
一:紅黑樹與234樹的等價關係如下:
乙個234樹可以變成多個紅黑樹,原因在於三節點(有兩個元素的節點)變成紅黑樹後可以變成 下面這兩種。
二:現在開始從234樹的插入操作來說明紅黑樹的插入操作。
1.當插入位置為234的2節點位置(只有乙個元素),0或2(圖一),那麼則變成(圖二),很明顯整個234樹的機構不用調整。那麼對應紅黑樹來說可以想象一下當前紅黑樹只有乙個節點,也就是根節點,那麼這時插入乙個節點,就變成了上黑下紅(圖三),也就是說當向乙個紅黑樹中插入節點時(新節點都是預設為紅色),如果它的父親p是黑色,則說明此時p節點對應到234樹上後p就是乙個2節點(只有乙個元素)。
(圖一)
(圖三)
2.當插入位置為234的3節點位置(只有兩個元素),如圖一,可能插入的位置是前中後(4,5,8)。這個時候因為234樹的結構沒有被破壞(即任何乙個節點不能超過3個元素)。所以234樹的結構不用改變。也就是說 234樹的3節點變成了4節點(2個元素變成了3個元素),
然後我們看一下234樹中4節點(只有三個元素)對應於紅黑樹的結構(圖2),一定是乙個黑帶著兩個紅子節點,參照234樹與紅黑樹的對應原理,兩個紅色節點上移到父節點。就變成了乙個4節點(3個元素的)234樹的乙個節點了。
再來看一下下邊的圖一,插入的位置不同時,對應於紅黑樹有6種情況:這裡我們假設6和7這兩個點先以6為父節點,7為6的右子樹,(實際上反過來也行,因為乙個234樹可以變成多個紅黑樹,但是對我們理解來說都一樣)如下。
同理如果以7位父節點,6為7的左子樹,則插入時就變成了如下
因此,對比這種情況,如果我們對紅黑樹做插入操作時,如果可以判斷插入的地方是乙個3節點,那麼我們就可以確定我們插入之後,這個節點的最終形態肯定是一黑二紅的顏色,且黑色為父親。那麼我們怎麼能知道我們向紅黑樹中插入時這這種情況呢。下面來分析一下:
a.插入時 新節點x預設為紅色,他的父節點為p,如果父節點為黑色,說明父親是乙個沒有兒子的節點(234樹中的2節點) 或者是只有乙個兒子,那麼兒子是紅色的,那麼我們就不需要做結構和顏色的調整了。
b.如果父親是紅色的,說明對於他的父親p是別人的子節點,那麼我看看叔叔是不是紅色的,(注意:紅黑樹中葉子節點是黑子的,葉子節點僅指代nil節點)。如果叔叔也是紅色的,說明人家三個人(爺爺父親,叔叔)玩的好好的,已經滿足了一黑二紅了,那麼我要加進去,勢必需要破壞平衡也就是下邊要講的四節點插入,那麼如果叔叔是黑色的,說明我根本沒有叔叔,可能你會問,為什麼叔叔是黑色就說明沒有叔叔,因為想一想,你做插入之前,這顆樹要不然是空樹,要麼已經平衡了,就是說所有的節點要麼滿足一黑一紅,要麼滿足一黑二紅,不可能出現這樣乙個節點 (他的紅色的,他的乙個兒子黑色,乙個兒子紅色),或者(他是黑色,其他乙個兒子是紅色,另乙個兒子是黑色)。可以從兩個方面去驗證,第乙個是從紅黑樹的五大特性中的任何乙個節點到達自己最簡葉節點的黑節點數量都是相同的。且不可能出現兩個紅節點相連。另乙個是我推薦的從234樹的角度上去考慮。234樹上每個節點(2節點,3節點,4節點)一定是一黑一紅,或者一黑2紅。
接著說,如果叔叔是黑色的,那麼就說明從234樹來看,這個叔叔不是我們節點的,那麼我們通過旋轉和變色就完成了插入。
3.向234樹的四節點(有三個元素)中插入新節點,之前人家都滿足一黑二紅的原則了,即:父親和叔叔是紅色,爺爺是黑色的。說明人家玩的挺好了,我加進來後勢必要破壞這種結構,那麼按照234樹在四節點新增元素的規則,我們需要選出中間元素 4 為父節點然後**。最後改色。這時候4變成了紅色,可能會對上層結構產生破壞,本質上就像插入了乙個新的元素,然後while或者遞迴就行了
以上插入操作就完成了
紅黑樹 學習
紅黑樹筆記 紅黑樹是一顆二叉平衡樹,查詢不會破壞平衡性,所以和二叉平衡術查詢方式一致。從根節點開始查詢,為空就返回null,為當前值就返回,否則繼續向下查詢。如果當前節點的key為要查詢的節點的key,那麼直接返回當前值。如果當前節點的key大於要查詢的節點的key,那麼繼續向當前節點的左子節點查詢...
2 3 4樹和紅黑樹(上)
2 3 4查詢樹指的是一顆空樹或者所有節點是由以下三種節點總成的多路查詢樹 2 3 4 樹指的是完美平衡的2 3 4 搜尋樹,它具有以下特性 所以相對於二叉搜尋樹,2 3 4樹保證了相關操作在最壞情況下仍然是對數級別的複雜度,下面詳細的說明2 3 4樹的各種操作。查詢操作 查詢操作從根節點開始 插入...
紅黑樹原理
若左子樹不為空,則左子樹上所有節點的值都小於根節點的值 若右子樹不為空,則右子樹上所有節點的值都大於根節點的值 且左右子樹都為二叉搜尋樹 查詢 必須從根節點開始查詢 如果值比根節點大則查詢右子樹,否則左子樹,直到找到節點 插入 與查詢類似 逐個節點對比,直到找到滿足條件的null,就插入到相應位置 ...