在看jdk的HashMap的代碼的時候,看到了jdk8的實現方式用到了紅黑樹,而後,就看了一下。code
廢話少講,開始紅黑樹的簡介。jdk
紅黑樹的特性二叉樹
1.每一個節點或者是黑色,或者是紅色。jdk8
2.根節點是黑色。紅黑樹
3.每一個葉子節點是黑色。 [注意:這裏葉子節點,是指爲空的葉子節點!while
4.若是一個節點是紅色的,則它的子節點必須是黑色的。co
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仍然是一顆紅黑樹