思路:樹 —— 二叉樹 —— 平衡二叉樹 —— 紅黑樹算法
在講紅黑樹以前咱們的先明白什麼是樹?樹是一種經常使用的數據結構,它是一個由有限節點組成的一個具備層次關係的集合,數據就存在樹的這些節點中。數據結構
最頂層只有一個節點,稱爲根節點(root)。源碼分析
在分支出有一個節點,指向多個方向,若是某個節點下方沒有任何分叉的話,那麼這個節點就稱爲葉子節點。性能
從某節點出發,到葉子節點爲止,最長簡單路徑上邊的條數,稱爲該節點的高度。spa
從根節點出發,到某節點邊的條數,稱爲該節點的深度。blog
如圖1-1所示的樹,根節點root的深度爲0,高度爲2;節點3的深度爲1,高度爲1排序
樹結構的特色:(1)一個節點,即只有根節點,也能夠是一棵樹繼承
(2)其中任何一個幾點與下面全部節點構成的樹稱爲子樹遞歸
(3)根節點沒有父節點,而葉子節點沒有子節點源碼
(4)除跟節點外,任何節點有且僅有一個父節點
(5)任何節點能夠有0~n個子節點
二叉樹顧名思義就是每一個節點至多有兩個子節點的樹稱爲二叉樹。圖1-1正好就是一棵二叉樹。二叉樹是一種經典的數據結構,近似與二分法的一種數據結構實現,是高效算法實現的載體。而平衡二叉樹、二叉查找樹、紅黑樹則是二叉樹中最爲重要的概念。試想一下,若是一個二叉樹只有一條分支它還叫二叉樹嗎?
是的,它仍是一個二叉樹(圖1-2 a)。只不過它只是以「樹」之名,行「鏈表」之實,徹底忽視了二叉樹的優勢以及高效。因此咱們爲了儘量的展示二叉樹的優點還須要對二叉樹作一些約束。這就衍生出了平衡二叉樹的概念。
高度差是平衡一棵樹是否爲平衡二叉樹的決定條件。
平衡二叉樹的性質:(1)樹的左右高度差不能超過1
(2)任何往下遞歸的左子樹與右子樹,必須符合第一條性質
(3)沒有任何節點或只有根節點的樹也是平衡二叉樹
在平衡二叉樹的基礎上再增長一個條件:對於任何節點而言,它的左子樹上全部節點的值都小於它,它右子樹上全部節點的值都大於他。這樣就產生了更爲經典的二叉查找樹,這種樹最大的優勢就是查找數據很是快且數據有序,由於它只須要少數幾回的值比較就能夠找到須要的數據節點。可是這又帶來另外一個問題,那就是遍歷節點。
遍歷節點有三種經常使用方式:前序、中序、後序。他們的規律:(1)在任何遞歸子樹中,左節點必定在右節點以前遍歷
(2)前序、中序、後序僅僅指節點在遍歷是的位置順序
前序遍歷的順序:根節點——左節點——右節點
中序遍歷的順序:左節點——根節點——右節點
後序遍歷的順序:左節點——右節點——根節點
用圖1-2 b舉例,中序遍歷:6-7-8-9-10-11
咱們已經知道二叉查找樹是一種平衡樹,可是隨着數據的插入咱們怎麼保證二叉樹的平衡性呢?這就引入了 旋轉 的操做,旋轉又分爲左旋和右旋。
右旋:以某個節點爲中心,將它沉入它的右子節點,讓它的左子節點上升爲新樹的根節點(頂替本身下沉前的位置),上升前的右子節點變爲下沉後的左子節點。
左旋:同理,以某個節點爲中心,將它沉入它的左子節點,讓它的右子節點上升爲新樹的根節點(頂替本身下沉前的位置),上升前的左子節點變爲下沉後的右子節點。
經過左旋和右旋可使不平衡的二叉樹恢復平衡性。最爲直觀的就是AVL樹,AVL樹就是經過不斷的旋轉來達到樹的平衡的,AVL樹的平衡要求是全部遞歸子樹的高度差不能超過1,也就是說有遞歸子樹的高度差超過1就會出發AVL樹的旋轉操做。AVL是的性質形成了它的平衡性極好,查找數據效率高,可是卻犧牲了必定的增刪性能。但在實際生產過程咱們有不少場景會涉及大量的增刪操做,若是使用AVL樹其實並不那麼理想,由此,咱們能夠選擇紅黑樹。
紅黑樹本質上也是一種二叉平衡樹,增長了着色的操做,它相比於平衡二叉樹多了5個約束:
(1)節點只能是紅色和黑色
(2)根節點只能是黑色
(3)全部NIL節點都是黑色
(4)一條路徑上不能出現相鄰的兩個紅色節點
(5)在任何遞歸子樹內,根節點到葉子節點全部路徑上包含相同數目的黑色節點
注:NIL節點即Nothing In Leaf,在葉子節點上不存在的兩個虛擬節點
紅黑樹追求的是一種大體的平衡,它不像AVL樹那樣保證任何遞歸子樹的高度差不超過1,它保證的是從根節點到葉子節點的最長路徑不超過最短路徑的2倍
紅黑樹經過從新着色和左右旋轉維持平衡性。在插入時,紅黑樹和AVL樹都能在至多2次旋轉內恢復平衡,但在刪除時,AVL樹可能至多須要O(log n)次的旋轉才能恢復平衡,紅黑樹至多3次旋轉就能恢復平衡,這是因爲紅黑樹維持的是一種大體的平衡。
紅黑樹適合用於增刪操做頻繁的場景,這與AVL樹偏偏相反,AVL則適合遍歷操做頻繁的場景。
1.介紹
TreeMap是一個Map集合類,內部按照Key排序來組織內部結構,不一樣於通常的Map類,TreeMap是一個有序集合。
2.特色
TreeMap和HashMap同樣也繼承了AbstractMap抽象類,此外,還繼承了NavigableMap和SortedMap。繼承SortedMap就表示它的Key是有序不可重複的,Key必須實現Comparable或提供額外的比較器Comparator,因此Key不容許爲null,但Value能夠爲null。TreeMap中Key的去重並不是是覆寫HashCode和equals方法來實現的,而是經過Comparable或Comparator來實現的。TreeMap中同時存在Comparable和Comparator會優先使用Compatator。
3.源碼分析
4.TreeMap與HashMap