二叉查找樹,對於每一個結點n,n的左子樹中包含的元素都小於n中的元素,n的右子樹中包含的元素都大於等於n中的元素,即左子樹上的元素小於父結點的值,而右子樹上的元素大於等於父結點的值。以下圖所示。根結點的左子樹每一個元素都小於80,右子樹每一個元素都大於80.
查找方法,要斷定一個具體的目標是否存在於樹中,須要沿着從根開始的路徑,根據查找目標是小於仍是大於當前結點的值,相應地轉到當前結點的左子結點或右結點。最終或是找到目標元素,或是遇到路徑的末端,後者意味着目標不在樹中。
在二叉查找樹中添加元素,改過程相似於樹的查找過程,新元素添加爲樹的葉結點,從根開始,沿着每一個結點中元素所肯定的路徑,直到相應地方向上沒有子結點爲止,此時,將新元素添加爲葉結點。html
若是沒有其餘操做,二叉查找樹的樹形由元素的添加順序來決定。git
注:若是輸入是徹底有序的,二叉查找樹就會退化爲一個有序鏈表,削弱了它自己的價值,以下圖所示。
在二叉查找樹中刪除元素,要考慮以下三種狀況(參考下圖):
算法
當從二叉查找樹中刪除有兩個子結點的結點是,比較好的辦法是用它的中序後繼來取代它,即在中序遍歷中排在被刪元素以後的那個元素(緊鄰的下一個值)數組
在平衡二叉樹中進行查找,比在退化的樹中進行查找的效率高不少。在有n個結點的平衡樹中進行查找及添加操做的效率是進行O(log2 n)次比較(最長路徑的長度)。樹越退化,查找及添加操做的時間複雜度越接近O(n),它抵消了使用查找樹帶來的益處。數據結構
能夠對二叉查找樹進行旋轉以恢復平衡學習
右旋轉
.net
右旋轉
設計
並不是全部的不平衡狀況均可以用一個單一的旋轉解決,若是不平衡性是由根的右子結點的左子樹的長路徑引起的,則必須先繞那個異常子樹執行一次右旋轉,而後再繞根執行一次左旋轉(右-左旋轉)。若是不平衡是由根的左子結點的右子樹中的長路徑引起,則執行(左-右旋轉)htm
詳情見個人實驗博客blog
(statistics.sh腳本的運行結果截圖)
暫未給出答案
我會像奧德休斯同樣, 朝着心中的方向 ,哪怕衆神會在彼岸阻擋 。當我須要獨自站在 ,遠方的沙場 ,武器就是我緊握的夢想 ,而我受過的傷 ,都是個人勳章 。繼續加油!
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 188 | 1/1 | 25 | 算法分析 |
第二週 | 70/258 | 1/2 | 15/40 | 《構建之法》7-9章 |
第三週 | 474/732 | 1/3 | 20/60 | 查找和排序 |
第四五六週 | 1313/2045 | 4/7 | 12/72 | 棧和隊列 |
第七週 | 890/2935 | 1/8 | 14/86 | 樹 |
第八週 | 913/3848 | 1/9 | 20/106 | 二叉查找樹 |
第九周 |
(有空多看看現代軟件工程 課件 軟件工程師能力自我評價表)