紅黑樹性質
**參考
查閱很多部落格好像都沒有談及紅黑樹的由來,包括著名的演算法導論也只是先丟擲5條紅黑樹的性質,在介紹紅黑樹之前不得不先介紹2-3樹,左傾紅黑樹可以說等價於2-3樹。
一顆2-3樹具有如下三個特性
除了這三個形狀特性,還有乙個如下特性,對於每乙個節點,左子樹所有節點值都小於第乙個關鍵碼,中間子樹所有節點值都大於第乙個關鍵碼,小於第二個關鍵碼,右子樹所有節點值都大於第二個關鍵碼。
查詢節點的流程參照二叉搜尋樹,下面介紹插入節點流程:
首先找到被插入記錄應該插入的葉子節點
介紹紅黑樹5個性質前必須先介紹2-3樹如何轉化成紅黑樹的。
我們先模擬一下2-3樹插入1,2,3,4,5的過程,如下圖:
下面我們思考一下如果讓我們設計2-3樹的儲存資料結構,要如何設計?
二叉樹只需要value,left,right三個屬性,但現在2-3樹更複雜,value可能有乙個或者兩個,孩子可能兩個或者三個,我們可以用陣列或鍊錶,這是一種設計可行的方案。但是我們可以對上圖進行微小改動,讓他變成用之前的二叉樹的結構也可以儲存整棵樹。如下圖所示:
對於上圖,等價關係是完全成立的,把節點標識成紅色的就是為了說明,該紅色節點和父親是屬於2-3樹的同乙個節點,這也就說明了左傾紅黑樹等價於2-3樹,何為左傾紅黑樹?即紅色節點一定是左孩子,標準的紅黑樹的紅色節點可以是左孩子也可以是右孩子。
理解了2-3樹轉化成紅黑樹後,理解上面5點性質非常容易,第5點性質等價於2-3樹的性質:所有葉子節點都在同一層。
本篇部落格我們只介紹左傾紅黑樹,實現起來簡單一點。
圖中列舉了三種插入情況,也涵蓋了左傾紅黑樹所有的插入情況,讀者可以對著圖閱讀**,更能理解。
public
class
rbtree
comparable
, v>
}private node root;
private
int size;
public
rbtree()
public
intgetsize()
public
boolean
isempty()
// 判斷節點node的顏色
private
boolean
isred
(node node)
// node x
// / \ 左旋轉 / \
// t1 x ---------> node t3
// / \ / \
// t2 t3 t1 t2
private node leftrotate
(node node)
// node x
// / \ 右旋轉 / \
// x t2 -------> y node
// / \ / \
// y t1 t1 t2
private node rightrotate
(node node)
// 顏色翻轉
private
void
flipcolors
(node node)
// 向紅黑樹中新增新的元素(key, value)
public
void
add(k key, v value)
// 向以node為根的紅黑樹中插入元素(key, value),遞迴演算法
// 返回插入新節點後紅黑樹的根
private node add
(node node, k key, v value)
if(key.
compareto
(node.key)
<0)
node.left =
add(node.left, key, value)
;else
if(key.
compareto
(node.key)
>0)
node.right =
add(node.right, key, value)
;else
node.value = value;if(
isred
(node.right)&&!
isred
(node.left)
) node =
leftrotate
(node);if
(isred
(node.left)
&&isred
(node.left.left)
) node =
rightrotate
(node);if
(isred
(node.left)
&&isred
(node.right)
)flipcolors
(node)
;return node;
}// 返回以node為根節點的二分搜尋樹中,key所在的節點
private node getnode
(node node, k key)
public
boolean
contains
(k key)
public v get
(k key)
public
void
set(k key, v newvalue)
// 返回以node為根的二分搜尋樹的最小值所在的節點
private node minimum
(node node)
public
static
void
main
(string[
] args)
}
慕課網liuyubobo玩轉資料結構
資料結構c++版第二版清華大學出版社
演算法導論
演算法4
資料結構 紅黑樹
紅黑樹是二叉排序樹的改進,紅黑樹有幾個特點 1 節點只有2中顏色,紅色和黑色。2 根節點一定是黑色節點。3 紅色節點的子節點一定是黑色節點。4 黑色高度 根節點到每個葉子節點的路徑長度包含相同的黑色節點 相等。規定的插入的節點一定是紅色節點,紅黑樹的插入節點後需要調整的規則,插入節點需要調整的情況有...
資料結構 紅黑樹
一 紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在 電腦科學中用到的一種 資料結構 典型的用途是實現 關聯陣列 可以保證最長路徑不超過最短路徑的2倍,近似平衡。二 性質 性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3 每個葉節點 nil節點,空節點 是黑色的。性質...
資料結構 紅黑樹
紅黑樹是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是紅色也可以是黑色。通過對任何一條從根到葉子簡單路徑上的顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡。紅黑樹滿足下面的性質 1 每個節點,不是紅色就是黑色的 2 根節點是黑色的 3 如果乙個節點是紅色的...