二叉樹

一、定義

二叉樹是 n 個節點的有限集合,該集合或者爲空集(空二叉樹),或者由一個根節點和兩棵互不相交的、分被稱爲根節點的左子樹和右子樹組成。下圖爲一棵普通的二叉樹:

二、二叉樹的特點

由二叉樹定義以及圖示分析得出二叉樹有以下特點:

  1. 每個節點最多有兩棵子樹,所以二叉樹中不存在度大於2的節點。
  2. 左子樹和右子樹是有順序的,次序不能任意顛倒。
  3. 即使樹中某節點只有一棵樹,也要區分它是左子樹還是右子樹。

三、二叉樹的性質

  1. 在二叉樹的第 i 層上最多有 2^{k-1}個節點。( i >= 1 )
  2. 二叉樹中如果深度爲 k ,那麼最多有 2^{k} -1 個節點。( k >= 1)
  3. n_{0} = n_{2} + 1 n_{0}表示度數爲0的節點數,n_{2}表示度數爲2的節點數。
  4. 在完全二叉樹中,具有n個節點的完全二叉樹的深度爲log_{2}^{n} +1,其中log_{2}^{n}是向下取整。
  5. 若對n個節點的完全二叉樹從上到下且從左到右進行1 至 n 的編號,則對完全二叉樹中任意一個編號爲i的節點有如下特徵:
  1. 若 i=1 ,則該節點是二叉樹的根,無雙親。否則,編號爲 i/2 的節點爲其雙親節點;
  2. 若 2i>n,則該節點無左孩子,否則,編號爲 2i 的節點爲其左孩子節點;
  3. 若 2i+1>n,則該節點無右孩子節點,否則,編號爲 2i+1 的節點爲其右孩子節點;

四、斜樹

所有的節點都只有左節點的二叉樹爲左斜樹;所有的節點都只有右節點的二叉樹爲右斜樹。

五、滿二叉樹

滿二叉樹中,如果所有的分枝節點都存在左子樹和右子樹,並且所有葉子都在同一層,這樣的二叉樹稱爲滿二叉樹。其特點爲:

  1. 葉子只能出現在最下一層,出現在其他層就不可能達成平衡。
  2. 非葉子節點的度一定爲2.
  3. 在同樣深度的二叉樹中,滿二叉樹的節點個數最多,葉子數最多。

                              

六、完全二叉樹

對一棵有 n 個節點的二叉樹按層編號,如果編號爲 i ( 1<=i<=n )的節點與同樣深度的滿二叉樹中的編號爲 i 的節點(非葉子)在二叉樹中的位置完全相同,則這棵樹稱爲完全二叉樹。

                                           

完全二叉樹的特點爲:

  1. 葉子節點只能出現在最下層和次下層
  2. 最下層的葉子節點集中在數的左部
  3. 次下層若存在葉子節點,一定是在右部連續位置。
  4. 如果節點度爲1,則該節點只有左子樹,即沒有右子樹。
  5. 同樣節點數的二叉樹,完全二叉樹的深度最小。

注:滿二叉樹一定是完全二叉樹,但反過來不一定成立。對於這兩個數最好的記憶方法就是除葉子節點外,其節點都是從上到下,從左到右連續排列。

七、二叉樹的存儲

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

二叉樹到此結束,謹以此文回顧二叉樹的基本結構及用法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章