1. 程式人生 > >二叉樹的定義、性質

二叉樹的定義、性質

一、二叉樹的定義 

      二叉樹是一種特殊的樹結構,也是常用的樹結構。二叉樹的儲存和處理比一般的樹簡單,同時一般的樹都能通過簡單的轉換得到與之對應的二叉樹,這樣就可以採用二叉樹的儲存結構和有關演算法來解決樹的有關問題。

   二叉樹與樹一樣具有遞迴性質,它與樹的區別主要有以下兩點:

1)二叉樹的每個結點至多隻有兩棵子樹(即二叉樹中不存在度大於2的結點)

2)二叉樹的子樹有左右之分,其次序不能任意顛倒。


二、二叉樹的性質
性質1 在二叉樹的第i層上至多有2^(i-1)個結點(i>=1)

性質2 深度為k的二叉樹至多有2^k-1個結點

性質3 對任何一顆二叉樹T,如果其終端結點數位n0,度為2的結點數位n2,則n0=n2+1;

     因為二叉樹中所有結點的度均小於或等於2,所以其結點總數為 n=n0+n1+n2;  

除了根結點外,其餘結點都有一個分支進入,設B為分支總是,則n=B+1;由於這些分支都是由度為1或2的結點射出的,所以又有B=n1+2n2,所以 n=n1+2n2+1 -> n0=n2+1

兩種特殊形態的二叉樹,它們是滿二叉樹完全二叉樹

    滿二叉樹:深度為k且含有2^k-1個結點的二叉樹

    滿二叉樹的特點是:每一層上的結點數都是最大結點數,即每一層i的結點數都具有最大值2^(i-1)可以對滿二叉樹的結點進行連續編號,約定編號從根結點起,自上而下,自左至右。由此可以引出完全二叉樹的定義。

    完全二叉樹:深度為k的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應時,稱之為完全二叉樹。

    完全二叉樹的特點是:

    1)葉子結點只可能在層次最大的兩層上出現

    2)對任一結點,若其右分支下的子孫的最大層次為l,則其左分支下的子孫的最大層次必為l或l+1.

性質4和性質5是完全二叉樹的兩個重要特性


性質4 具有n個結點的完全二叉樹深度為[log2(n)]+1(不大於log2(n)的最大整數);

根據性質2和完全二叉樹的定義有

2^(k-1)-1<n<=2^k-1 或  2^(k-1)<=n<2^k

於是k-1 <= log2n < k;

性質5 如果對一棵有n個結點的完全二叉樹(其深度為[log2(n)]+1)的結點按層序編號(從第1層到第[log2(n)]+1層,每層從左到右),則對任一結點i(1<=i<=n),有

1)如果i = 1,則結點i是二叉樹的根,無雙親;如果i > 1,則其雙親PARENT(i)是[i/2].

2)如果2i > n,則結點i無左孩子(結點i為葉子結點);否則其左孩子LCHILD(i)是結點2i;

3)如果2i+1 > n,則結點i無右孩子;否則其右孩子RCHILD(i)是結點2i+1.

三、二叉樹的儲存結構

1.順序儲存結構

二叉樹的順序儲存表示:

#define MAXTSIZE 100             /*二叉樹的最大結點數*/

typedef TElemType SqBiTree[MAXTSIZE];

SqBiTree bt;

這種順序儲存結構僅適用於完全二叉樹

2.鏈式儲存結構

    因為用順序儲存結構可能會造成儲存空間的極大浪費,對於一般二叉樹更適合採用鏈式儲存結構。

由二叉樹的定義,二叉樹的結點由一個數據元素和分別指向其左、右子樹的兩個分支構成,則表示二叉樹的連結串列中的結點至少包含3個域:資料域和左、右指標域。

有時,為了方便找到結點的雙親,還可在結點結構中增加一個指向其雙親結點的指標域。利用這兩種結點結構所得二叉樹的儲存結構分別稱之二叉連結串列三叉連結串列

含有n個結點的二叉連結串列中有n+1個空鏈域。因為在n個結點的二叉連結串列中,必有2n個鏈域。除根結點外,每個結點有且僅有一個雙親的,所以只會有n-1個結點的鏈域存放指標,空指標數目 = 2n-(n-1) = n+1;

可以利用這些空鏈域儲存其他有用資訊,從而得到另一種鏈式儲存結構——線索連結串列

二叉樹的二叉連結串列儲存表示:

typedef struct BiTNode
{
      TElemType data;                  /*結點資料域*/
      struct BiTNode *lchild,*rchild;   /*左右孩子指標*/
}BiTNode,*BiTree;

二叉樹的三叉連結串列儲存表示:

typedef struct TriTNode
{
       TElemType data;                  /*結點資料域*/
       struct TriTNode *lchild,*parent,*rchild   /*多了個雙親指標*/
}TriTNode,*TriTree;