Java數據結構和算法(一)樹
數據結構與算法目錄(http://www.javashuo.com/article/p-qvigrlkr-da.html)html
前面講到的鏈表、棧和隊列都是一對一的線性結構,這節講一對多的線性結構 - 樹。「一對多」就是指一個元素只能有一個前驅,但能夠有多個後繼。java
1、樹的基本概念
![樹](http://static.javashuo.com/static/loading.gif)
- 度(Degree) :節點擁有的子樹數。樹的度是樹中各個節點度的最大值。
- 節點 :度爲 0 的節點稱爲葉節點(Leaf)或終端節點。度不爲 0 的節點稱爲分支節點。除根節點外,分支節點也被稱爲內部節點。
- 節點關係 :節點的子樹的根稱爲該節點的孩子(Child)。該結點稱爲孩子的雙親或父結點。同一個雙親的孩子之間互稱爲兄弟。
- 節點的層次 :從根開始定義起,根爲第一層,根的孩子爲第二層。雙親在同一層的節點互爲堂兄弟。樹中節點的最大層次稱爲樹的深度(Depth)或高度。
- 有序樹 :若是將樹中節點的各個子樹當作從左到右是有次序的,不能互換的,則稱該樹爲有序樹,不然稱爲無序樹。
- 森林 :m(m>=0)棵互不相交的樹的集合。
2、二叉樹
二叉樹(Binary Tree)是樹的特殊一種,具備以下特色:一、每一個結點最多有兩顆子樹,結點的度最大爲 2 ;二、左子樹和右子樹是有順序的,次序不能顛倒;三、即便某結點只有一個子樹,也要區分左右子樹。算法
2.1 斜樹
全部的結點都只有左子樹(左斜樹),或者只有右子樹(右斜樹)。這就是斜樹,應用較少。數據庫
![斜樹](http://static.javashuo.com/static/loading.gif)
2.2 滿二叉樹
全部的分支結點都存在左子樹和右子樹,而且全部的葉子結點都在同一層上,這樣就是滿二叉樹。就是完美元滿的意思,關鍵在於樹的平衡。數組
![滿二叉樹](http://static.javashuo.com/static/loading.gif)
根據滿二叉樹的定義,獲得其特色爲:數據結構
- 葉子只能出如今最下一層。
- 非葉子結點度必定是 2。
- 在一樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子樹最多。
2.3 徹底二叉樹
對一棵具備 n 個結點的二叉樹按層序排號,若是編號爲 i 的結點與一樣深度的滿二叉樹編號爲 i 結點在二叉樹中位置徹底相同,就是徹底二叉樹。滿二叉樹必須是徹底二叉樹,反過來不必定成立。數據結構和算法
任何數組和徹底二叉樹均可以相互轉換 。其中關鍵點是按層序編號,而後對應查找。下圖就是一個徹底二叉樹。性能
![徹底二叉樹](http://static.javashuo.com/static/loading.gif)
徹底二叉樹定義獲得其特色:指針
- 葉子結點只能出如今最下一層(滿二叉樹繼承而來)
- 最下層葉子結點必定集中在左 部連續位置。
- 倒數第二層,若有葉子節點,必定出如今右部連續位置。
- 一樣結點樹的二叉樹,徹底二叉樹的深度最小(滿二叉樹也是對的)。
2.4 平衡二叉樹
平衡二叉樹又被稱爲 AVL 樹(區別於AVL算法),它是一棵二叉排序樹,且具備如下性質:htm
- 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過 1,而且左右兩個子樹都是一棵平衡二叉樹
- 非葉子節值大於左邊子節點、小於右邊子節點;
- 沒有值相等重複的節點;
![平衡二叉樹](http://static.javashuo.com/static/loading.gif)
2.5 紅黑樹
由於平衡二叉樹查詢性能和樹的層級(h高度)成反比,h值越小查詢越快、爲了保證樹的結構左右兩端數據大體平衡下降二叉樹的查詢難度通常會採用一種算法機制實現節點數據結構的平衡,實現了這種算法就有紅黑樹。紅黑樹的應用比較普遍,主要是用它來存儲有序的數據,它的時間複雜度是O(lgn),效率很是之高。例如,Java 集合中的 TreeSet 和 TreeMap。
![紅黑樹](http://static.javashuo.com/static/loading.gif)
紅黑樹的特性:
- 每一個節點或者是黑色,或者是紅色。
- 根節點是黑色。
- 每一個葉子節點(NIL)是黑色。 [注意:這裏葉子節點,是指爲空(NIL或NULL)的葉子節點!]
- 若是一個節點是紅色的,則它的子節點必須是黑色的。
- 從一個節點到該節點的子孫節點的全部路徑上包含相同數目的黑節點。
2.6 B+ 樹
B+ 樹充分的利用了節點的空間,讓查詢速度更加穩定,其速度徹底接近於二分法查找。例如 MySQL 的數據庫索引查找。
![B+ 樹](http://static.javashuo.com/static/loading.gif)
- B+ 樹的非葉子節點不保存關鍵字記錄的指針,這樣使得 B+ 樹每一個節點所能保存的關鍵字大大增長;
- B+ 樹葉子節點保存了父節點的全部關鍵字和關鍵字記錄的指針,每一個葉子節點的關鍵字從小到大連接;
- B+ 樹的根節點關鍵字數量和其子節點個數相等;
- B+ 的非葉子節點只進行數據索引,不會存實際的關鍵字記錄的指針,全部數據地址必需要到葉子節點才能獲取到,因此每次數據查詢的次數都同樣;
天天用心記錄一點點。內容也許不重要,但習慣很重要!