目錄
一、引言
如果有對紅黑樹的定義及調整過程有過研究,其實很容易理解HashMap中的紅黑樹插入節點的調整過程。
“紅黑樹定義及調整過程”的參考文章:《紅黑樹原理、查詢效率、插入及變化規則分析》
下面的流程圖就是HashMap原始碼中,紅黑樹插入節點的調整過程。這個過程要是寫文章講的話,感覺也沒什麼意思,其實關鍵還是需要你要清楚紅黑樹的定義及調整過程,然後知道資料結構裡二叉樹左旋、右旋調整的過程。接下來需要做的,就是慢慢啃這段不長的原始碼。
你看到最後會發現,這個過程中的判斷、步驟,都是基於我上面說的:紅黑樹的定義、紅黑樹的調整過程、二叉樹左旋/右旋調整的過程,然後就是一些指標操作。
二、HashMap原始碼中紅黑樹插入節點的調整過程
三、閱讀HashMap原始碼的一些Tips
1. 程式碼風格
HashMap原始碼中特別喜歡在判斷語句中加賦值語句,形如:if ((xp = x.parent) == null)
。它這一行程式碼做了兩件事:
- 把x.parent賦值給xp
- 判斷xp是否為null
還喜歡使用連等號,形如:pp = r.parent = p.parent
。它這一行程式碼也做了兩件事:
- 把p.parent賦值給r.parent
- 把r.parent賦值給pp
這種程式碼風格我看著很不習慣,但是看多了後,也就習慣了。
2. 變數名
原始碼中的樹指標的變數命名其實很有規律:
r
對應右子樹,l
對應左子樹,p
對應父節點,pp
對應爺爺節點。
舉個例子:變數名pr的含義是,父節點的右子樹。
balanceInsertion
方法中的變數名
root x所在樹的根節點
x 要插入的節點
xp x的parent節點
xpp x的parent的parent -> 爺爺節點
xppl x的爺爺節點的左子樹
xppr x的爺爺節點的右子樹
+-----+
+----+ +----+
| +-----+ |
| xpp |
+--v--+ +--v--+
+------+ | | |
| +-----+ +-----+
| xppl xppr
+--v--+ xp
| |
+-----+
x
rotateLeft
、rotateRight
方法中的變數名
p 旋轉的關鍵點
pp p的parent節點
r p的右子節點節點
l p的左子節點節點
rl p的右子節點節點的左子節點
lr p的左子節點節點的右子節點