紅黑樹的添加與刪除
主脈絡參考http://www.cnblogs.com/skywang12345/p/3245399.html#!comments
補圖刪除操作:https://blog.csdn.net/eson_15/article/details/51144079
R-B Tree的在線生成:http://sandbox.runjs.cn/show/2nngvn8w
數據結構與算法匯總:http://www.cnblogs.com/skywang12345/p/3603935.html
紅黑樹 R-B Tree
1、紅黑樹的時間復雜度與特性
1.1 特性:
(1):每個節點不是黑色就是紅色;
(2):根節點是黑色
(3):葉子結點(為空的葉子節點)是黑色
(4):若一個節點是紅色,則其子節點必為黑色,反之不成立
(5):從一個節點到該節點的子孫節點的所有路徑上有相同數目的黑節點。
1.2 時間復雜度:
(1):紅黑樹的時間復雜度是O(logn)。
(2):一顆含有n個節點的紅黑樹的高度至多為2*log(n+1);
2、左旋與右旋(旋轉前後仍然是二叉查找樹)
2.1:對x節點左旋:被旋轉的節點成為一個左節點;
2.2:對x節點右旋:被旋轉節點成為一個右節點;
z x / / \ --(左旋)--> x y z / y ------------------------------------ y x \View Code/ \ --(右旋)--> x y z z
3、紅黑樹基本操作--添加
3.1:RB-Insert:
找到該節點的插入位置y,並將其染成紅色;
3.2:RB-Insert-FixUp
3.2.1:被插入節點是根節點:著黑;
3.2.2:被插入節點父節點是黑色,直接插入
3.2.3:被插入節點父節點是紅色:
case1:父節點紅,叔叔節點紅:
(1):父節點、叔叔節點設為黑
(2):祖父節點設為紅
(3):以祖父節點為當前節點,再判斷;
case2:父節點紅,叔叔節點黑,插入節點是右孩子;
(1):以父節點為當前節點
(2):左旋,再判斷;
case3:父節點紅,叔叔節點黑,插入節點是左孩子:
(1):父節點設為黑;
(2):祖父節點設為紅;
(3):以祖父節點為支點右旋;
4、紅黑樹的基本操作--刪除
4.1:RB-delete:
(將後繼節點設置為與刪除節點相同的顏色,這樣只處理後繼節點原位置處的平衡)
4.1.1:被刪除節點沒有兒子,直接刪除;
4.1.2:被刪除節點只有一個兒子,直接刪除,唯一子節點頂替;
4.1.3:被刪除節點有兩個兒子:找右孩子的左孩子,一直找下去(二叉搜索樹的刪除)。
4.2:RB-Delete-FixUP:
4.2.1:x為黑,兄弟節點是紅(父節點和兄弟的字節點是黑);
(1)父節點設紅,兄弟設黑,父節點左旋;
4.2.4:x為黑,兄弟節點是黑:
case1:兄弟兩個子節點都是黑:
(1):兄弟節點設紅;
(2):當前節點更新為祖父節點;
case2:兄弟左節點是紅,右節點是黑:
(1):兄弟節點設紅,兄弟左子節點設黑;
(2):以兄弟節點作右旋;
case3:兄弟左節點任意,右節點是紅:
(1):兄弟節點設為父節點顏色;
(2):父節點設黑,兄弟右節點設黑;
(3):以父節點為支點左旋;
5:Java實現:
紅黑樹的添加與刪除