二叉樹Binary_Tree(1):二叉樹及其數組實現


定義


  

二叉樹:

  二叉樹是一種特殊的樹。二叉樹的特點是每個結點最多有兩個兒子,左邊的叫做左兒子,右邊的叫做右兒子,或者說每個結點最多有兩棵子樹。更加嚴格的遞歸定義是:二叉樹要么為空,要么由根結點、左子樹和右子樹組成,而左子樹和右子樹分別是一棵二叉樹。 下面這棵樹就是一棵二叉樹。

    

  

           概念圖

    

  樹具有的性質:n 個結點有 n-1 條邊

  推論:若樹有 n 個結點,則它有 2n 個指針域,有 n+1 個已使用的指針域,有 n-1 個空指針域 

  

深度(高度):

  這里引入深度的概念,我們規定根結點的深度為1,則其子結點的深度為2,子結點的子結點的深度為3......依次類推。

  

  

二叉樹的兩種類型


 

  1.滿二叉樹:一顆深度為h且有(2^h)-1個結點的二叉樹

   

 

   性質:1.若葉子結點有 n 個,則總結點數為 2n-1

      2.若結點有 n 個,則樹高為 ⌊log2n⌋ + 1 

 

 

  2.完全二叉樹:設高度為h的一棵樹,除了第h層外,其他第2~(h-1)層都達到最大結點數,第h層從右向左缺失若干個結點,那么這棵樹為完全二叉樹。我們可以認為滿二叉樹為完美的完全二叉樹

    

   

 

                完全二叉樹的幾個例子

    

    性質:1.若結點有 n 個,則樹高為 ⌊log2n⌋ + 1

       2.若樹高為 h, 則總結點數 n ≤ 2h - 1

       3. 若樹的深度為 k ,則第 k 層有 2k-1 個結點 

       推論:若結點有 n 個,則葉子結點有 ⌊n/2⌋ 個

    完全二叉樹最大的優點是可以通過父(子)結點編號求得子(父)結點編號。

 

數組實現


  

 

  

      概念圖 

法一:

  給定一個數組a[MAXSIZE],若父結點為a[k] (k != 0),則其左子結點為a[2k],右子結點為a[2k+1],左子結點的左子結點為a[(2^2)*k],左子結點的右子結點為a[(2^2)*k+1],右子結點的左子結點為a[(2^2)*k+2],右子結點的右子結點為a[(2^2)*k+3]......

  可以推導出,深度為n的第一個結點的左子結點(位於n+1層)為a[(2^n)*k],另一個子結點即右子結點為a[2^n)*k+1]

  那么我們要求出深度為n+1時的任一結點,只要將其數組下標與深度的關系得出即可列出一個等式,令返回值==等式值即可,時間復雜度為O(1)

 

法二:

  通過上圖我們發現如果完全二叉樹的一個父結點編號為k,那么它左兒子的編號就是2*k,右兒子的編號就是2*k+1。如果已知兒子(左兒子或右兒子)的編號是x,那么它父結點的編號就是x/2,注意這里只取商的整數部分。在C語言中如果除號‘/’兩邊都是整數的話,那么商也只有整數部分(即自動向下取整),即4/2和5/2都是2。另外如果一棵完全二叉樹有N個結點,那么這個完全二叉樹的高度為log2 N簡寫為log N,即最多有log N層結點。

  代碼如下:

for (i = 1;  i <  (int) pow (2,k) - 1; i++) //數組索引從1開始
    cin >> a[i];

 //注意最后一個葉子結點之前的空結點也需要標出來,假設上面的概念圖中結點2的右孩子5為空,則數組存儲為 1 2 3 4 空 6,否則會造成結構缺失

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM