紅黑樹:二叉查找樹+平衡二叉樹(大致平衡的)
核心性質:從根節點到任意葉子節點最長的路徑不大於最短路徑的二倍。
在插入和刪除操作中核心性質可能不再滿足,所以在插入刪除中要進行判斷是否滿足,但是直接判斷是否滿足核心性質麻煩,就用了五條容易判斷的性質進行等價替換。
五條性質:
1.根節點是黑色的。
2.節點非黑即紅。
3.不每條路徑上不能有連續兩個紅色節點。
4.從任意節點到葉子節點黑節點數量相同。
5.葉子節點都是黑色的。
為了算法的描述方便設置每個葉子節點都是黑色哨兵節點。
插入過程(五條):默認插入的節點是紅色節點,要是默認是黑色的會很麻煩(由於性質4)。
1.如果插入節點的父節點不存在就將顏色改為黑色。(因為這個節點就是根節點)
void case1(node){
if(node.parent==NULL){
node.color = black;
}else {
case2(node)
}
}
****插入過程的五條判斷實際上都是五個函數,並且內部都是一個if-else判斷,在if中判斷,else中調用下一個函數。形式都是上邊這種
2.如果插入的節點的父節點是黑色,則ok,zhijiereturn。
3.如果插入的節點的父親節點和叔叔節點是紅色,則變化父叔節點為黑色,再把祖父節點變為紅色,然后將祖父節點作為node,從case1開始判斷。
4.
(1)父節點P是紅色而叔父節點U是黑色或缺少,並且新節點N是其父節點P的右子節點而父節點P又是其父節點的左子節點。
則父進行左旋,然后執行case5.
(2)父節點P是紅色而叔父節點U是黑色或缺少,並且新節點N是其父節點P的左子節點而父節點P又是其父節點的右子節點。
則父進行右旋,然后執行case5.
5.父變黑,祖父變紅
(1)父節點P是紅色而叔父節點U是黑色或缺少,並且新節點N是其父節點P的右子節點而父節點P又是其父節點的右子節點。
則祖父進行左旋
(2)父節點P是紅色而叔父節點U是黑色或缺少,並且新節點N是其父節點P的左子節點而父節點P又是其父節點的左子節點。
則祖父進行右旋
左旋就是:逆時針
右旋就是:順時針
刪除操作六條:形式也是六個函數,if-else格式的。
1.刪除的是根,直接刪。
2.