資料結構 紅黑樹

2021-10-14 03:35:13 字數 3411 閱讀 3458

紅黑樹性質

**參考

查閱很多部落格好像都沒有談及紅黑樹的由來,包括著名的演算法導論也只是先丟擲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 如果乙個節點是紅色的...