目錄右旋
紅黑樹的插入
插入修復偽**
不用修復的情況:
插入修復情況1
插入修復情況2
插入修復情況3
紅黑樹的刪除
刪除修復情況2
刪除修復情況3
刪除修復情況4
後記引用參考
每個結點不是紅就是黑(非紅即黑)
根結點是黑的(根黑)
每個葉結點:指樹尾端nil指標或null結點,是黑的(nil/null黑)
如果乙個結點是紅的,那麼它的倆個兒子都是黑的,即從每個葉子到根的所有路徑上都不能有兩個連續的紅色結點(紅父黑孩)
對於任一結點而言,其到葉結點樹尾端nil指標的每一條路徑都包含相同數目的黑結點(路徑黑同數)
左旋左旋偽**:
left-rotate(t, x)
對左旋的理解
右旋右旋偽**
right-rotate(t,x)
對右旋的理解
插入偽**
rb-insert(t,z)
z.p = y
if(y == nil[t]) t.root = z//判斷z要插入的位置
else if(z.key < y.key) y.left = z
else y.right = z
z.left = t.nil
z.right = t.nil
z.color = red
rb-insert_fixup(t,z)
}
為什麼插入的結點要染成紅色呢?
插入修復偽**
rb-insert-fixup(t,z)
else //情況3:當前結點是父結點的左子
z.p.color = black//父變黑
z.p.p.color = red//祖變紅
right-rotate(t,z.p.p)//祖右旋}}
else
else
z.p.color = black
z.p.p.color = red
left-rotate(t,z.p.p)}}
}t.root.color = black//根肯定是黑的
return root
}
(特此說明:當前代指當前結點,父代指父結點,叔代指父的兄弟結點,祖代指祖父結點,數字1,2,3,4,5代指上述對應性質)
不用修復的情況:
插入的是根結點
插入的結點的父結點是黑色
插入修復情況1
為什麼這麼做?
插入修復情況2
為什麼這麼做?
插入修復情況3
為什麼這麼做?
刪除偽**
rb-transplant(t,x,y)
rb-delete(t,z)
else if(z.right == t.nil)
else
rb-transplant(t,z,y)//用y頂替z的位置
y.left = z.left//y接管z的左孩子
y.left.p = y
y.color = z.color//y接管z的顏色
}//如果y原來是黑色的,進行修復
if(y-origial-color == black) rb-delete-fixup(t,x)
}
刪除修復偽**rb-delete-fixup(t,z)
if(w.left.color == black && w.right.color == black)
else //情況4:兄的孩左右皆紅
w.color = z.p.color //兄顏色變為父
z.p.color = black //父變黑
w.right.color = black //兄右孩變黑
left-rotate(t,z.p) //父左旋
z = t.root //當前為根}}
else
if(w.right.color == black && w.left.color == black)
else //情況4:兄的孩左右皆紅
w.color = z.p.color //兄顏色變為父
z.p.color = black //父變黑
w.left.color = black //兄左孩變黑
right-rotate(t,z.p) //父右旋
z = t.root //當前為根}}
}z.color = black
}
理解修復的準備
修復思路
刪除修復情況1
問一句為什麼?
刪除修復情況2
問一句為什麼?
刪除修復情況3
問一句為什麼?
刪除修復情況4
問一句為什麼?
教你透徹了解紅黑樹
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹筆記 紅黑樹的插入操作
紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...