排序二叉樹,平衡二叉樹和紅黑樹的概念以及相關的操作講解

1. 排序二叉樹

   

排序二叉樹是一種特殊結構的二叉樹,可以非常方便地對樹中所有節點進行排序和檢索。

排序二叉樹要麼是一棵空二叉樹,要麼是具有下列性質的二叉樹:

  • 若它的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
  • 若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
  • 它的左、右子樹也分別爲排序二叉樹

圖 1 顯示了一棵排序二叉樹:

 

圖 1. 排序二叉樹


對排序二叉樹,若按中序遍歷就可以得到由小到大的有序序列。如圖 1 所示二叉樹,中序遍歷得:

{2,3,4,8,9,9,10,13,15,18}

1.1 創建排序二叉樹

創建排序二叉樹的步驟,也就是不斷地向排序二叉樹添加節點的過程,向排序二叉樹添加節點的步驟如下:

  1. 以根節點當前節點開始搜索。
  2. 拿新節點的值和當前節點的值比較。
  3. 如果新節點的值更大,則以當前節點的右子節點作爲新的當前節點;如果新節點的值更小,則以當前節點的左子節點作爲新的當前節點。
  4. 重複 2、3 兩個步驟,直到搜索到合適的葉子節點爲止。
  5. 將新節點添加爲第 4 步找到的葉子節點的子節點;如果新節點更大,則添加爲右子節點;否則添加爲左子節點
 
1.2刪除排序二叉樹中的節點
 

當程序從排序二叉樹中刪除一個節點之後,爲了讓它依然保持爲排序二叉樹,程序必須對該排序二叉樹進行維護。維護可分爲如下幾種情況:

(1)被刪除的節點是葉子節點,則只需將它從其父節點中刪除即可。

(2)被刪除節點 p 只有左子樹,將 p 的左子樹 pL 添加成 p 的父節點的左子樹即可;被刪除節點 p 只有右子樹,將 p 的右子樹 pR 添加成 p 的父節點的右子樹即可。

(3)若被刪除節點 p 的左、右子樹均非空,有兩種做法:

  • 將 pL 設爲 p 的父節點 q 的左或右子節點(取決於 p 是其父節點 q 的左、右子節點),將 pR 設爲 p 節點的中序前趨節點 s 的右子節點(s 是 pL 最右下的節點,也就是 pL 子樹中最大的節點)。
  • 以 p 節點的中序前趨或後繼替代 p 所指節點,然後再從原排序二叉樹中刪去中序前趨或後繼節點即可。(也就是用大於 p 的最小節點或小於 p 的最大節點代替 p 節點即可)。

2.平衡二叉樹

 

平衡二叉樹:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。構造與調整方法 平衡二叉樹的常用算法有紅黑樹、AVL、Treap等。 最小二叉平衡樹的節點的公式如下 F(n)=F(n-1)+F(n-2)+1 這個類似於一個遞歸的數列,可以參考Fibonacci數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。

3.紅黑樹

3.1紅黑樹的性質

紅黑樹在原有的排序二叉樹增加了如下幾個要求:

 

  • 性質 1:每個節點要麼是紅色,要麼是黑色。
  • 性質 2:根節點永遠是黑色的。
  • 性質 3:所有的葉節點都是空節點(即 null),並且是黑色的。
  • 性質 4:每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的路徑上不會有兩個連續的紅色節點)
  • 性質 5:從任一節點到其子樹中每個葉子節點的路徑都包含相同數量的黑色節點。

 

Java 中實現的紅黑樹可能有如圖 6 所示結構:


圖 6. Java 紅黑樹的示意


備註:本文中所有關於紅黑樹中的示意圖採用白色代表紅色。黑色節點還是採用了黑色表示。

根據性質 5:紅黑樹從根節點到每個葉子節點的路徑都包含相同數量的黑色節點,因此從根節點到葉子節點的路徑中包含的黑色節點數被稱爲樹的“黑色高度(black-height)”。

性質 4 則保證了從根節點到葉子節點的最長路徑的長度不會超過任何其他路徑的兩倍。假如有一棵黑色高度爲 3 的紅黑樹:從根節點到葉節點的最短路徑長度是 2,該路徑上全是黑色節點(黑節點 - 黑節點 - 黑節點)。最長路徑也只可能爲 4,在每個黑色節點之間插入一個紅色節點(黑節點 - 紅節點 - 黑節點 - 紅節點 - 黑節點),性質 4 保證絕不可能插入更多的紅色節點。由此可見,紅黑樹中最長路徑就是一條紅黑交替的路徑。

紅黑樹和平衡二叉樹

 

紅黑樹並不是真正的平衡二叉樹,但在實際應用中,紅黑樹的統計性能要高於平衡二叉樹,但極端性能略差。

由此我們可以得出結論:對於給定的黑色高度爲 N 的紅黑樹,從根到葉子節點的最短路徑長度爲 N-1,最長路徑長度爲 2 * (N-1)。

提示:排序二叉樹的深度直接影響了檢索的性能,正如前面指出,當插入節點本身就是由小到大排列時,排序二叉樹將變成一個鏈表,這種排序二叉樹的檢索性能最低:N 個節點的二叉樹深度就是 N-1。

紅黑樹通過上面這種限制來保證它大致是平衡的——因爲紅黑樹的高度不會無限增高,這樣保證紅黑樹在最壞情況下都是高效的,不會出現普通排序二叉樹的情況。

由於紅黑樹只是一個特殊的排序二叉樹,因此對紅黑樹上的只讀操作與普通排序二叉樹上的只讀操作完全相同,只是紅黑樹保持了大致平衡,因此檢索性能比排序二叉樹要好很多。

但在紅黑樹上進行插入操作和刪除操作會導致樹不再符合紅黑樹的特徵,因此插入操作和刪除操作都需要進行一定的維護,以保證插入節點、刪除節點後的樹依然是紅黑樹


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章