1. 程式人生 > >Java資料結構和演算法(一)樹

Java資料結構和演算法(一)樹

Java資料結構和演算法(一)樹

前面講到的連結串列、棧和佇列都是一對一的線性結構,這節講一對多的線性結構 - 樹。「一對多」就是指一個元素只能有一個前驅,但可以有多個後繼。

一、樹

樹

  • 度(Degree) :節點擁有的子樹數。樹的度是樹中各個節點度的最大值。
  • 節點 :度為 0 的節點稱為葉節點(Leaf)或終端節點。度不為 0 的節點稱為分支節點。除根節點外,分支節點也被稱為內部節點。
  • 節點關係 :節點的子樹的根稱為該節點的孩子(Child)。該結點稱為孩子的雙親或父結點。同一個雙親的孩子之間互稱為兄弟。
  • 節點的層次 :從根開始定義起,根為第一層,根的孩子為第二層。雙親在同一層的節點互為堂兄弟。樹中節點的最大層次稱為樹的深度(Depth)或高度。
  • 有序樹 :如果將樹中節點的各個子樹看成從左到右是有次序的,不能互換的,則稱該樹為有序樹,否則稱為無序樹。
  • 森林 :m(m>=0)棵互不相交的樹的集合。

二、二叉樹

二叉樹(Binary Tree)是樹的特殊一種,具有如下特點:1、每個結點最多有兩顆子樹,結點的度最大為 2 ;2、左子樹和右子樹是有順序的,次序不能顛倒;3、即使某結點只有一個子樹,也要區分左右子樹。

2.1 斜樹

所有的結點都只有左子樹(左斜樹),或者只有右子樹(右斜樹)。這就是斜樹,應用較少。

斜樹

2.2 滿二叉樹

所有的分支結點都存在左子樹和右子樹,並且所有的葉子結點都在同一層上,這樣就是滿二叉樹。就是完美圓滿的意思,關鍵在於樹的平衡。

滿二叉樹

根據滿二叉樹的定義,得到其特點為:

  1. 葉子只能出現在最下一層。
  2. 非葉子結點度一定是 2。
  3. 在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子樹最多。

2.3 完全二叉樹

對一棵具有 n 個結點的二叉樹按層序排號,如果編號為 i 的結點與同樣深度的滿二叉樹編號為 i 結點在二叉樹中位置完全相同,就是完全二叉樹。滿二叉樹必須是完全二叉樹,反過來不一定成立。

其中關鍵點是按層序編號,然後對應查詢。

完全二叉樹

上圖就是一個完全二叉樹。

結合完全二叉樹定義得到其特點:

  1. 葉子結點只能出現在最下一層(滿二叉樹繼承而來)
  2. 最下層葉子結點一定集中在左 部連續位置。
  3. 倒數第二層,如有葉子節點,一定出現在右部連續位置。
  4. 同樣結點樹的二叉樹,完全二叉樹的深度最小(滿二叉樹也是對的)。

2.4 平衡二叉樹

平衡二叉樹又被稱為 AVL 樹(區別於AVL演算法),它是一棵二叉排序樹,且具有以下性質:

  1. 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過 1,並且左右兩個子樹都是一棵平衡二叉樹
  2. 非葉子節值大於左邊子節點、小於右邊子節點;
  3. 沒有值相等重複的節點;

平衡二叉樹


每天用心記錄一點點。內容也許不重要,但習慣很重要!