紅黑樹實現 go

2021-10-01 04:59:47 字數 3074 閱讀 9266

紅黑樹是一種含有紅黑結點並能自平衡的二叉查詢樹。它必須滿足下面性質:

性質1:每個節點要麼是黑色,要麼是紅色。

性質2:根節點是黑色。

性質3:每個葉子節點(nil)是黑色。

性質4:每個紅色結點的兩個子結點一定都是黑色。

性質5:任意一結點到每個葉子結點的路徑都包含數量相同的黑結點。

關於紅黑樹的插入和刪除,樓主有時間會在後面補充,這裡先貼上**,**裡面有部分注釋。

package test

import

("fmt"

"testing"

)type color int

const

( black color =

iota

red)var root *rbtree

var m =

make

(map

[color]

string,2

)func

init()

type rbtree struct

//左旋

func

leftrotate

(node *rbtree)

node.father = right

node.right = right.left

right.left = node

//考慮根節點問題

if right.father ==

nilelse

else}}

//右旋

func

rightrotate

(node *rbtree)

node.father = left

node.left = left.right

left.right = node

//考慮根節點問題

if left.father ==

nilelse

else}}

func

add(value int

)*rbtree

//找出當前節點,value存在,當前節點為插入節點,更新插入值,value不存在,當前節點為插入節點父節點

forif currentnode.value == value

if currentnode.value < value

else

}if currentnode.value > value

else}}

insertnode.father = currentnode

//當前節點為黑色,直接插入

if currentnode.color == black

else

}func

dowhilepisred

(insertnode *rbtree)

else

//對pp進行右旋

rightrotate

(pp)

return

}//p節點是pp節點的右子節點,與左子節點執相對操作

}else

else

leftrotate

(pp)

return}}

if unclenode.color == red

if pp.father.color == red }}

func

testadd

(t *testing.t)

func

bl(node *rbtree)

if node.father ==

nilelse

bl(node.left)

bl(node.right)

}func

delete

(value int

) afternode :=

getafternode

(delnode)

//後繼節點為紅色,存在兩個黑子節點或不存在子節點

//若後繼節點==刪除節點,後繼節點不存在右子節點,->後繼節點不存在子節點

//若後繼節點!=刪除節點,後繼節點不存在左子節點,->後繼節點不存在子節點

//從而推出後繼節點為紅色時,可直接刪除

if afternode.color == red

else

//清空依賴,釋放資源

afternode.father =

nil}

else

else

if afternode.left !=

nilelse

else

afternode.father =

nil}

}//賦值替換

delnode.value = afternode.value

}//後繼節點為黑色,忽略子節點問題

func

dowhileafternodeisblack

(afternode *rbtree)

else

else

if bronode.left !=

nil}

//執相對操作

}else

else

if bronode.right !=

nil}

}//bro為黑色但不存在子節點的情況

if bronode.color == black

else

dowhileafternodeisblack

(father)

}//bro為紅色

}else}}

//獲取節點

func

getnode

(value int

)*rbtree ()

forelse

else

}else

else}}

}}//獲取後繼節點

func

getafternode

(node *rbtree)

*rbtree

currentnode := node.right

count :=

1defer

func()

()forelse

}}

紅黑樹實現

紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...

紅黑樹實現

按演算法導論裡的偽 用c 實現了紅黑樹。實現過程中,參考了nginx的紅黑樹實現,特別是右旋的實現,演算法導論裡沒有給出,就借鑑了nginx的實現。對比了nginx的紅黑樹實現和演算法導論裡的偽 插入基本上一樣的,刪除兩者有點差別,但思路應該是一樣的。實現過程中需要注意的是,空葉子結點一定要實現,不...

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...