在看jdk的HashMap的代碼的時候,看到了jdk8的實現方式用到了紅黑樹,然後,就看了一下。
廢話少講,開始紅黑樹的簡介。
紅黑樹的特性
1.每個節點或者是黑色,或者是紅色。
2.根節點是黑色。
3.每個葉子節點是黑色。 [注意:這裏葉子節點,是指爲空的葉子節點!
4.如果一個節點是紅色的,則它的子節點必須是黑色的。
5.從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。
紅黑樹的添加:
第一步: 將紅黑樹當作一顆二叉查找樹,將節點插入。
第二步:將插入的節點着色爲"紅色"。
第三步: 通過一系列的旋轉或着色等操作,使之重新成爲一顆紅黑樹。
僞代碼:
RB-INSERT(T, z)
01 y ← nil[T] // 新建節點“y”,將y設爲空節點。
02 x ← root[T] // 設“紅黑樹T”的根節點爲“x”
03 while x ≠ nil[T] // 找出要插入的節點“z”在二叉樹T中的位置“y”
04 do y ← x
05 if key[z] < key[x]
06 then x ← left[x]
07 else x ← right[x]
08 p[z] ← y // 設置 “z的父親” 爲 “y”
09 if y = nil[T]
10 then root[T] ← z // 情況1:若y是空節點,則將z設爲根
11 else if key[z] < key[y]
12 then left[y] ← z // 情況2:若“z所包含的值” < “y所包含的值”,則將z設爲“y的左孩子”
13 else right[y] ← z // 情況3:(“z所包含的值” >= “y所包含的值”)將z設爲“y的右孩子”
14 left[z] ← nil[T] // z的左孩子設爲空
15 right[z] ← nil[T] // z的右孩子設爲空。至此,已經完成將“節點z插入到二叉樹”中了。
16 color[z] ← RED // 將z着色爲“紅色”
17 RB-INSERT-FIXUP(T, z) // 通過RB-INSERT-FIXUP對紅黑樹的節點進行顏色修改以及旋轉,讓樹T仍然是一顆紅黑樹