最近看了些關於紅黑二叉樹的部落格,有一些自己的見解。
紅黑二叉樹是一種特殊的平衡二叉樹,擁有平衡二叉樹的所有特徵,這裡就不再重複。
紅黑二叉樹的規則:
1、每個節點都必須有葉子節點(葉子節點沒有任何資料);
2、根節點和葉子節點必須是黑色;
3,紅節點的父節點必須是黑色;
4、從根節點到任何葉子節點,他們的黑色節點的數目必須相同;
規則解釋:
每個節點,不管有沒有子節點,都必須有兩個葉子節點,如果有子節點,則替換掉相應的葉子節點。
2/3/4點:由於任何分支到根節點的黑色節點數目必須相同,這就保證了各個分支之間長度相差<=1,這就是平衡二叉樹的要求。
如果有插入操作,那麼為了保證分支黑色節點數目相同,插入的資料一定是紅節點,但是插入的節點的父節點卻不一定是黑色節點,這個問題下面討論。
紅黑二叉樹的操作:
左旋、右旋、重新著色。
左旋、右旋:當子二叉樹不平衡時,如果左邊的分支比右邊的長,就進行右旋。顧名思義,向右旋轉,具體操作是,讓子根節點a的左子節點b成為子根節點,然後b的右子節點成為a的左子節點,這樣就達到的右旋,左旋與右旋相似。
重新著色:左旋、右旋操作後要進行重新著色,從根節點開始著色,按照黑紅黑的順序著色,(如果存在末端節點一邊有子節點,一邊是葉子節點,則這個節點一定是黑色;如果所有末端節點都沒有子節點,則這一級節點全都是黑色,不需要遵循紅黑順序)著色完成後,計算各個分支的黑色節點數目,如果數目相同,則二叉樹平衡;否則對不平衡的子二叉樹進行左旋、右旋操作,直到二叉樹平衡。
增加:增加的節點一定是紅色,以保持黑色節點數目相同。增加節點的父節點如果紅色,代表這個子二叉樹不平衡,按需要左旋或右旋,操作完成後重新著色,計算黑色節點數目,如不平衡,再調整。
紅黑二叉樹
紅黑二叉樹 紅黑二叉樹的基本思想是想用標準的二叉查詢樹 完全由2 結點構成 和一些額外的資訊 替換3 結點 來表述2 3樹。或者說,我們將3 結點表示為由一條左斜的紅色鏈結相 兩個2 結點其中之一是另乙個的左子節點 連的兩個2 結點。這種表示的優點 我們無需修改就可以直接使用標準二叉查詢樹的get ...
二叉樹 紅黑樹
也就是說,二叉排序樹中,左子樹都比節點小,右子樹都比節點大,遞迴定義。根據二叉排序樹這個特點我們可以知道,二叉排序樹的中序遍歷一定是從小到大的,比如上圖,中序遍歷結果是 1 3 4 6 7 8 10 13 14 效能取決於 public class demo public static void m...
二叉樹(三) 紅黑樹
紅黑樹是一種自平衡的二叉查詢樹,可解決二叉查詢樹因為多次插入新節點導致的不平衡問題。除了二叉查詢樹的基本特性外,還具有下列的特性 1 節點是紅色或者黑色 2 根節點是黑色 3 每個葉子節點都是黑色的空節點 nil節點 4 每個紅色節點的兩個子節點都是黑色。從每個葉子到根的所有路徑上不能有兩個連續的紅...