1. 排序二叉樹java
排序二叉樹是一種特殊結構的二叉樹,能夠很是方便地對樹中全部節點進行排序和檢索。算法
排序二叉樹要麼是一棵空二叉樹,要麼是具備下列性質的二叉樹:ide
圖 1 顯示了一棵排序二叉樹:性能
圖 1. 排序二叉樹spa
對排序二叉樹,若按中序遍歷就能夠獲得由小到大的有序序列。如圖 1 所示二叉樹,中序遍歷得:.net
{2,3,4,8,9,9,10,13,15,18}
1.1 建立排序二叉樹code
建立排序二叉樹的步驟,也就是不斷地向排序二叉樹添加節點的過程,向排序二叉樹添加節點的步驟以下:htm
當程序從排序二叉樹中刪除一個節點以後,爲了讓它依然保持爲排序二叉樹,程序必須對該排序二叉樹進行維護。維護可分爲以下幾種狀況:blog
(1)被刪除的節點是葉子節點,則只需將它從其父節點中刪除便可。排序
(2)被刪除節點 p 只有左子樹,將 p 的左子樹 pL 添加成 p 的父節點的左子樹便可;被刪除節點 p 只有右子樹,將 p 的右子樹 pR 添加成 p 的父節點的右子樹便可。
(3)若被刪除節點 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紅黑樹的性質
紅黑樹在原有的排序二叉樹增長了以下幾個要求:
Java 中實現的紅黑樹可能有如圖 6 所示結構:
備註:本文中全部關於紅黑樹中的示意圖採用白色表明紅色。黑色節點仍是採用了黑色表示。
根據性質 5:紅黑樹從根節點到每一個葉子節點的路徑都包含相同數量的黑色節點,所以從根節點到葉子節點的路徑中包含的黑色節點數被稱爲樹的「黑色高度(black-height)」。
性質 4 則保證了從根節點到葉子節點的最長路徑的長度不會超過任何其餘路徑的兩倍。假若有一棵黑色高度爲 3 的紅黑樹:從根節點到葉節點的最短路徑長度是 2,該路徑上全是黑色節點(黑節點 - 黑節點 - 黑節點)。最長路徑也只可能爲 4,在每一個黑色節點之間插入一個紅色節點(黑節點 - 紅節點 - 黑節點 - 紅節點 - 黑節點),性質 4 保證毫不可能插入更多的紅色節點。因而可知,紅黑樹中最長路徑就是一條紅黑交替的路徑。
由此咱們能夠得出結論:對於給定的黑色高度爲 N 的紅黑樹,從根到葉子節點的最短路徑長度爲 N-1,最長路徑長度爲 2 * (N-1)。
提示:排序二叉樹的深度直接影響了檢索的性能,正如前面指出,當插入節點自己就是由小到大排列時,排序二叉樹將變成一個鏈表,這種排序二叉樹的檢索性能最低:N 個節點的二叉樹深度就是 N-1。
紅黑樹經過上面這種限制來保證它大體是平衡的——由於紅黑樹的高度不會無限增高,這樣保證紅黑樹在最壞狀況下都是高效的,不會出現普通排序二叉樹的狀況。
因爲紅黑樹只是一個特殊的排序二叉樹,所以對紅黑樹上的只讀操做與普通排序二叉樹上的只讀操做徹底相同,只是紅黑樹保持了大體平衡,所以檢索性能比排序二叉樹要好不少。
但在紅黑樹上進行插入操做和刪除操做會致使樹再也不符合紅黑樹的特徵,所以插入操做和刪除操做都須要進行必定的維護,以保證插入節點、刪除節點後的樹依然是紅黑樹
答案是:ABCD