紅黑樹的刪除操作 以JDK原始碼為例

2022-07-17 19:00:22 字數 2164 閱讀 9677

1.刪除的是紅色節點,則刪除節點並不影響紅黑樹的樹高,無需處理。

2.刪除的是黑色節點,則刪除後,刪除節點所在子樹的黑高bh將減少1,需要進行調整。

無需調整的情況(向上回溯時)

刪除左孩子情況:

s為紅; s染紅,p染黑,左旋p。

s為黑,ln與rn為黑; s染紅,x回溯至p。

s為黑,ln為紅,rn為黑; ln染黑,s染紅,右旋p。

s為黑,ln隨意,rn為紅; s變為p的顏色,p和rn染黑,左旋p。

刪除右孩子的情況和刪除左孩子的情況相對稱。

所有的情況為:

以刪除左孩子為例,如下圖,x為刪除節點的後繼節點。則p的左子樹黑高度比右子樹少1。若經過調整後,左右子樹黑高恢復相等,則完成修復,否則,會轉換為另一種情況,並按次方法繼續進行修正。

情況轉換的的原因:經調整後,左右子樹的黑高度仍不相等,需要針對新的情況繼續進行調整。

若修正後的左右子樹黑高相同,則修正結束,無需情況轉換。

轉換如下:

case 1 ==>> case 2-2,case 3,case 4-1或 case 4-2 不會引起黑高變化

case 2-1 ==>> all cases 當p為root節點時,會使整個樹的黑高度減少1(唯一減少樹黑高的情況)。

case 2-2 ==>> redover 並結束調整。

case 3 ==>> case 4-1或 case 4-2;

case 4 ==>> rootover;

根據jdk源**,分析函式對各種情況的處理方法。

private void fixafterdeletion(treemap.entryvar1) 

if (colorof(leftof(var2)) && colorof(rightof(var2))) else

//經[case 3]修正後轉換為[case 4]

//[case 4]分為兩種情況,但修正方法相同

setcolor(var2, colorof(parentof(var1)));//將s染成p的顏色

setcolor(parentof(var1), true); //p染黑

setcolor(rightof(var2), true); //rn染黑

this.rotateleft(parentof(var1)); //左旋p

var1 = this.root; //x回溯至根節點

//至此修正已基本完成(還有可能對根節點染黑)

}} else

if (colorof(rightof(var2)) && colorof(leftof(var2))) else

//經[case 3]修正後轉換為[case 4]

//[case 4]分為兩種情況,但修正方法相同

setcolor(var2, colorof(parentof(var1)));//s染成p的顏色

setcolor(parentof(var1), true); //p染黑

setcolor(leftof(var2), true); //ln染黑

this.rotateright(parentof(var1)); //右旋p

var1 = this.root; //x直接回溯到root

//至此修正已基本完成(還有可能對根節點染黑)}}

}//根紅色節點染黑,或者將根節點染黑

setcolor(var1, true);

}

紅黑樹節點刪除後的「雙黑」現象修正,雖然情況複雜,情況間轉換也複雜,但這些轉換都是為了修正節點刪除產生的葉節點黑深度不相等。而黑深度相等是紅黑樹的規定之一,紅黑樹的規定可以確保樹中節點的高效插入,搜尋和刪除操作。這些努力都是為了實現資料結構的良好效能。

紅黑樹刪除操作

紅黑樹刪除操作 紅黑樹要刪除某個key值時,首先還是要查詢該key值在樹中的位置,查詢方法和搜尋二叉樹方法相同 要刪除的結點分為兩種情況 有左右兩個孩子都存在 兩個孩子都存在時,在該節點的右子樹中尋找其直接後繼,找到後用其值替換要刪除節點的值,然後問題轉化為刪除該節點的直接後繼,直接後繼是有乙個右孩...

紅黑樹的刪除操作

原文 可能出現的情形討論 刪除紅黑樹中乙個結點,刪除的結點是其子結點狀態和顏色的組合。子結點的狀態有三種 無子結點 只有乙個子結點 有兩個子結點。顏色有紅色和黑色兩種。所以共會有6種組合。組合1 被刪結點無子結點,且被刪結點為紅色 此時直接將結點刪除即可,不破壞任何紅黑樹的性質。組合2 被刪結點無子...

JDK原始碼那些事兒之紅黑樹基礎下篇

說到hashmap,就一定要說到紅黑樹,紅黑樹作為一種自平衡二叉查詢樹,是一種用途較廣的資料結構,在jdk1.8中使用紅黑樹提公升hashmap的效能,今天就來說一說紅黑樹,上一講已經給出插入平衡的調整操作,這一講就說說更為複雜的刪除平衡操作。維基百科 中文 維基百科 筆者這裡會根據維基百科的講解做...