紅黑樹是一種含有紅黑結點並能自平衡的二叉查詢樹。它必須滿足下面性質:
性質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.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...