紅黑樹的介紹
紅黑樹的五條性質
紅黑樹的關鍵操作
引言
因為博主最近在學習hashmap的原始碼,因為自從jdk1.8之後,hashmap就是由陣列+鍊錶+紅黑樹實現的,所以為了更深的去了解hashmap的原理,先來帶大家一起複習一下紅黑樹的知識紅黑樹是乙個平衡二叉樹,但不是絕對完美的平衡二叉樹,紅黑樹是在普通的二叉樹上,加了乙個顏色的屬性所構成的,整個紅黑樹需要滿足以下五條性質:
節點是紅色或黑色。瞬間懵逼?了解一下印象就行,開始玩魔方都是要照著魔方公式一點點玩的,多玩幾次就熟悉了。紅黑樹也一樣,紅黑樹有兩大操作:根節點是黑色。
所有葉子節點都是黑色。(葉子是nuil節點)
每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點,並沒有說不能出現連續的黑色節點)
從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
recolor (重新標記黑色或紅色)因為當你對紅黑樹進行新增或者刪除操作的時候,對樹做的修改可能會破壞紅黑樹的性質。為了繼續保持紅黑樹的性質,可以通過對結點進行重新著色,以及對樹進行相關的旋轉操作,即通過修改樹中某些結點的顏色及指標結構,來達到對紅黑樹進行插入或刪除結點等操作後繼續保持它的性質或平衡的目的。rotation (旋轉,從而使樹達到平衡)
我們會先嘗試 recolor,如果 recolor 不能達到紅黑樹的 4 點要求,然後我們嘗試 rotation,其實紅黑樹的關鍵玩法就是弄清楚 recolor 和 rotation 的規則
首先我們來介紹一下紅黑樹的旋轉操作,紅黑樹有個特點,新增的節點預設為紅色,且左邊的節點永遠小於右邊的節點,比如:
這裡是乙個紅黑樹,當你從數軸的左側往右側看的時候,它在橫軸上的投影永遠都是從左向右依次遞增的。
然後我們由一棵根節點為10的紅黑樹開始逐步講解
正常插入節點
首先我們插入5這個節點,因為5小於10,所以直接將5插入成為10的左節點
當你要在插入乙個大小為4的節點,由於4小於10,所以向10的左子樹看,4又小於5,所以再看向5的左子樹,此時5的下方只有葉子節點(nuil),所以4成為了5的左節點:
紅黑樹的變色
此時並沒有結束,因為紅黑樹要求不可以有兩個連續的紅色節點,否則就違反了性質4,所以我們要對節點進行變色處理,將4的父節點5變為黑色
紅黑樹的旋轉
然而此時紅黑樹就不再平衡,為了使紅黑樹再次平衡,此時我們的旋轉就出場了,紅黑樹的旋轉遵循乙個原則「父母圍著孩子轉」,也就是說父節點繞著子節點進行旋轉,旋轉方向分為左旋轉和右旋轉,具體方向依照節點的大小決定。
1.右旋轉
此時由於4小於5,10又大於5,所以按照規則,5的父節點,也就是10,向右做旋轉操作(因為父節點大於子節點),成為了5的右節點
2.左旋轉
對於這樣的一棵紅黑樹
當我們插入乙個50的節點的時候,
首先找到5,50>5,然後向右,找到10,50>10,再向右找到20,50>20,則再向右發現只有葉子節點(nuil),則成為了20的右節點
由於此時又出現了兩個連續的紅色節點,所以進行變色處理,依次向上遞迴變色,首先將20變為黑色,然後發現20的父節點小於20,為了平衡紅黑樹,所以我們進行左旋轉處理(因為父節點小於子節點),即10成為了20的左節點,並且變為紅色
這裡就是紅黑樹的變色與旋轉操作
下一步就是對hashmap原始碼的講解,請大家敬請期待!
了解紅黑樹
既然我們要說紅黑樹,我們就要了解紅黑樹是一種完美自平衡的二叉查詢樹,接下來說一下二叉查詢樹的特點 有點像二分查詢 右子樹的值大於根節點的值 左節點的值小於根節點的值 左右子樹也一定是二叉排序樹 接下來說一下紅黑樹的特點 根節點必須是黑色的 每個節點都有顏色,要麼是紅色,要麼是黑色的 每個葉子的節點都...
資料結構 紅黑樹
紅黑樹是二叉排序樹的改進,紅黑樹有幾個特點 1 節點只有2中顏色,紅色和黑色。2 根節點一定是黑色節點。3 紅色節點的子節點一定是黑色節點。4 黑色高度 根節點到每個葉子節點的路徑長度包含相同的黑色節點 相等。規定的插入的節點一定是紅色節點,紅黑樹的插入節點後需要調整的規則,插入節點需要調整的情況有...
資料結構 紅黑樹
一 紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在 電腦科學中用到的一種 資料結構 典型的用途是實現 關聯陣列 可以保證最長路徑不超過最短路徑的2倍,近似平衡。二 性質 性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3 每個葉節點 nil節點,空節點 是黑色的。性質...