上個星期學習了樹,本星期接着學習樹的一種擴展:二叉查找樹(Binary Search Tree)。它最大的特色就是左孩子小於父節點,右孩子大於父節點,這種特色讓二叉查找樹從建立到插入元素都能維持排序的屬性(主要表如今:中序遍歷時元素能準確按照由小到大的順序排列),有利於以後對樹中元素的處理,特別是須要用到搜索時能大大提升搜索效率(低至O(log₂n))(不平衡樹除外╰(‵□′)╯)。html
操做 | 說明 |
---|---|
addElement | 往樹中添加一個元素 |
removeElement | 從樹中刪除一個元素 |
removeAllOccurences | 從樹中刪除所指定元素的任何存在 |
removeMin | 刪除樹中的最小元素 |
removeMax | 刪除樹中的最大元素 |
findMin | 返回一個指向樹中最小元素的引用 |
findMax | 返回一個指向樹中最大元素的引用 |
二叉查找樹要表現出它高效的優勢,必需要達到平衡,不然其效率甚至不如線性的鏈表。
(圖)git
爲此,書中介紹了平衡化二叉查找樹的方法——旋轉,兩種平衡化二叉查找樹——AVL樹、紅黑樹。
旋轉:以右旋爲例,其應用於左子樹高度太高的非平衡樹的平衡化中,步驟爲:數據結構
(圖)學習
左旋反之。並不是全部不平衡問題只須要一次旋轉就夠解決了,在具體過程當中要應變地使用左右旋轉。設計
1、紅黑樹與AVL樹做爲平衡化二叉查找樹的手段,二者到底各有何種優越性?調試
紅黑樹不追求"徹底平衡",書中提到:htm
在某種程度上,紅黑樹中的平衡限制沒有AVL樹那麼嚴格。可是...blog
非嚴格的平衡給紅黑樹帶來了什麼好處呢?——它的旋轉次數獲得下降,任何不平衡將在3次旋轉之內解決,對於插入和刪除致使的失衡,紅黑樹能夠更快地調整本身的平衡。排序
(無)教程
(statistics.sh腳本的運行結果截圖)
上週無錯題
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 6/6 | |
第二週 | 771/771 | 1/2 | 16/22 | |
第三週 | 562/1233 | 1/3 | 15/37 | |
第四周 | 1503/2736 | 2/5 | 15/52 | |
第五週 | 1152/3888 | 1/6 | 10/62 | |
第六週 | 787/4675 | 1/7 | 10/72 | |
第七週 | 1214/5889 | 1/8 | 9/81 |