HashMap中紅黑樹插入節點的調整過程

daheww發表於2022-05-02

一、引言

如果有對紅黑樹的定義及調整過程有過研究,其實很容易理解HashMap中的紅黑樹插入節點的調整過程。

“紅黑樹定義及調整過程”的參考文章:《紅黑樹原理、查詢效率、插入及變化規則分析》

下面的流程圖就是HashMap原始碼中,紅黑樹插入節點的調整過程。這個過程要是寫文章講的話,感覺也沒什麼意思,其實關鍵還是需要你要清楚紅黑樹的定義及調整過程,然後知道資料結構裡二叉樹左旋、右旋調整的過程。接下來需要做的,就是慢慢啃這段不長的原始碼。

你看到最後會發現,這個過程中的判斷、步驟,都是基於我上面說的:紅黑樹的定義、紅黑樹的調整過程、二叉樹左旋/右旋調整的過程,然後就是一些指標操作。

二、HashMap原始碼中紅黑樹插入節點的調整過程

三、閱讀HashMap原始碼的一些Tips

1. 程式碼風格

HashMap原始碼中特別喜歡在判斷語句中加賦值語句,形如:if ((xp = x.parent) == null)。它這一行程式碼做了兩件事:

  1. 把x.parent賦值給xp
  2. 判斷xp是否為null

還喜歡使用連等號,形如:pp = r.parent = p.parent。它這一行程式碼也做了兩件事:

  1. 把p.parent賦值給r.parent
  2. 把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

rotateLeftrotateRight方法中的變數名

p    旋轉的關鍵點
pp   p的parent節點
r    p的右子節點節點
l    p的左子節點節點
rl   p的右子節點節點的左子節點
lr   p的左子節點節點的右子節點

相關文章