一、定義
二叉樹是 n 個節點的有限集合,該集合或者爲空集(空二叉樹),或者由一個根節點和兩棵互不相交的、分被稱爲根節點的左子樹和右子樹組成。下圖爲一棵普通的二叉樹:
二、二叉樹的特點
由二叉樹定義以及圖示分析得出二叉樹有以下特點:
- 每個節點最多有兩棵子樹,所以二叉樹中不存在度大於2的節點。
- 左子樹和右子樹是有順序的,次序不能任意顛倒。
- 即使樹中某節點只有一棵樹,也要區分它是左子樹還是右子樹。
三、二叉樹的性質
- 在二叉樹的第 i 層上最多有 2個節點。( i >= 1 )
- 二叉樹中如果深度爲 k ,那麼最多有 2 -1 個節點。( k >= 1)
- n = n + 1 n表示度數爲0的節點數,n表示度數爲2的節點數。
- 在完全二叉樹中,具有n個節點的完全二叉樹的深度爲log +1,其中log是向下取整。
- 若對n個節點的完全二叉樹從上到下且從左到右進行1 至 n 的編號,則對完全二叉樹中任意一個編號爲i的節點有如下特徵:
- 若 i=1 ,則該節點是二叉樹的根,無雙親。否則,編號爲 i/2 的節點爲其雙親節點;
- 若 2i>n,則該節點無左孩子,否則,編號爲 2i 的節點爲其左孩子節點;
- 若 2i+1>n,則該節點無右孩子節點,否則,編號爲 2i+1 的節點爲其右孩子節點;
四、斜樹
所有的節點都只有左節點的二叉樹爲左斜樹;所有的節點都只有右節點的二叉樹爲右斜樹。
五、滿二叉樹
滿二叉樹中,如果所有的分枝節點都存在左子樹和右子樹,並且所有葉子都在同一層,這樣的二叉樹稱爲滿二叉樹。其特點爲:
- 葉子只能出現在最下一層,出現在其他層就不可能達成平衡。
- 非葉子節點的度一定爲2.
- 在同樣深度的二叉樹中,滿二叉樹的節點個數最多,葉子數最多。
六、完全二叉樹
對一棵有 n 個節點的二叉樹按層編號,如果編號爲 i ( 1<=i<=n )的節點與同樣深度的滿二叉樹中的編號爲 i 的節點(非葉子)在二叉樹中的位置完全相同,則這棵樹稱爲完全二叉樹。
完全二叉樹的特點爲:
- 葉子節點只能出現在最下層和次下層
- 最下層的葉子節點集中在數的左部
- 次下層若存在葉子節點,一定是在右部連續位置。
- 如果節點度爲1,則該節點只有左子樹,即沒有右子樹。
- 同樣節點數的二叉樹,完全二叉樹的深度最小。
注:滿二叉樹一定是完全二叉樹,但反過來不一定成立。對於這兩個數最好的記憶方法就是除葉子節點外,其節點都是從上到下,從左到右連續排列。
七、二叉樹的存儲
1、順序存儲:就是使用一維數組存儲二叉樹中的節點,並且節點的存儲位置就是數組的下標。
上圖所示爲一棵完全二叉樹,採用順序存儲方式:
由上圖可知,當一棵二叉樹爲完全二叉樹時,節點剛好填滿數組。如果是一棵非完全二叉樹,採用這用存儲方式又會是怎樣的呢?下圖爲一棵非完全二叉樹:
淺色節點( D H I ) 表示不存在的節點,用二叉樹的順序存儲結構如下圖
由上圖可以看出,如果一棵非完全二叉樹仍採用順序存儲的話,就會造成一定的浪費。故此可採用另一種存儲方式。
2、二叉鏈表:二叉樹的每個節點最多有兩個孩子,因此,可以將節點數據結構定義爲一個數據和兩個指針域。表示方式如下圖所示:
二叉樹可以採用如下圖表示(一種鏈表結構存儲二叉樹,稱爲二叉鏈表):
八、二叉樹的遍歷
二叉樹的遍歷是指從二叉樹的根節點出發,按照某種次序依次訪問二叉樹中的所有節點,使得每個節點被訪問一次,且僅被訪問一次。二叉樹的訪問次序可以分爲四種:前序遍歷、中序遍歷、後序遍歷、層序遍歷。
1、前序遍歷:就是從二叉樹的根節點出發,當第一次到達節點時就輸出節點數據,按照從左向右的方向訪問。
對上圖的遍歷步驟爲:
先從根節點開始,第一次到達節點A,輸出A;
查看是否有左子節點,有,繼續向左訪問,第一次到達B,輸出B;
相同的規則,輸出 D H ;
此時查看H 是否有左子節點,發現沒有,返回D 節點(第二次到達不輸出),則查看D是否有右子節點,有 輸出I ,返回 D 節點(第三次到達不輸出);
此時 D已經輸出完畢 ,回到 D 的父節點 B ,查看B節點是否有右子節點並輸出E
經過次順序 依次輸出得是:ABDHIEJCFG
有上面的步驟,我們可以看出,整個遍歷的過程每一個節點都經過三次,前序遍歷就是當第一次到達該節點時輸出該值。
那麼同樣的道理,中序遍歷爲第二次到達節點時輸出該值,輸出結果爲:HDIBJEAFCG;後序遍歷爲第三次到達節點時輸出值,輸出的結果爲:HIDJEBFGCA
層序遍歷則是按照數的層次自上而下的遍歷二叉樹,七輸出結果爲:ABCDEFGHIJ
二叉樹到此結束,謹以此文回顧二叉樹的基本結構及用法。