樹(1)--樹和二叉樹的基本定義

fan_rockrock發表於2014-02-14

一:樹

1.樹的表示方式:

(1)圖形表示法(分支圖表示法)


(2)巢狀集合表示法


(3)廣義表表示法

( A ( B ( E  ,F( K, L ), ), C ( G ), D ( H , I, J ) )


(4)目錄表示法


(5)左孩子-右兄弟表示法

2.樹結構與線性結構的比較:

    線性結構:第一個結點無前驅,最後一個結點無後繼,其他結點有一個前驅和一個後繼;

    樹 結  構:根節點無前驅,多個葉子節點無後繼,其他結點只有一個前驅和多個後繼。

3.樹的儲存結構:

    (1).順序儲存:

                          可規定為: 從上至下、從左至右將樹的結點依次存入記憶體

                          重大缺陷:復原困難(不能唯一復原就沒有實用價值)

    (2).鏈式儲存:

                        指標域:一個前驅指標,n個後繼指標

                        存在問題:若規定等長結構體(即每個結構體有n個後繼指標),則浪費空間;若規定不等長,則要定義多種結構體,操作起來不方便。

*解決思路:先研究最簡單、最有規律的樹(二叉樹), 然後設法把一般的樹轉化為簡單樹(二叉樹)。


二.二叉樹.

1.性質:

   1): 在二叉樹的第i層上至多有2的n-1次方個結點(i>=1)

   2).深度為k的二叉樹至多有2的k次方-1個結點(k>=1)

   3).對於任何一棵二叉樹,若2度的結點數有n2個,則葉子數(n0)必定為n2+1 (即n0=n2+1)

2.滿二叉樹:

       1)深度為k的節點數為2的k次方-1.

       2).滿二叉樹第k層的結點個數比其1~k-1層所有結點個數之和多一個。

3.完全二叉樹:樹中的1~n個結點的位置與滿二叉樹的1~n個節點的位置相同.

      1) 葉子結點只可能在層次最大的兩層上出現;
      2) 對任一結點,若其右分支下的子孫的最大層次 為 L,則其左分支下的子孫的最大層次必為 L 或 L+1。

      3)具有n個結點的完全二叉樹的高度為└ log2n ┘ + 1(向下取整)

      4)具若對含n個結點的完全二叉樹從上到下且從左至右進行1至n的編號,則對二叉樹中任意一個編號為i的結點:
            (1)若i=1,則該結點是二叉樹的根,無雙親;      否則,編號為└ i/2 ┘的結點為其雙親結點;
            (2)若2i > n,則該結點無左孩子;      否則,編號為2i的結點為其左孩子結點;
            (3)若2i+1 > n,則該結點無右孩子結點;      否則,編號為2i+1的結點為其右孩子結點。

4.儲存結構:

   *順序儲存:        

 typedef TElemType  SqBiTree[MAX_TREE_SIZE]; 
                 // 0號單元儲存根結點
 SqBiTree  bt;

   1).這種結構只適合滿二叉樹和完全二叉樹

       

     因為這樣可以恢復到原來對應的唯一二叉樹,比如C的左右孩子依次為第6和第7個,陣列也恰好對應

    2).當二叉樹不再是滿二叉樹和完全二叉樹時,我們只能這樣做:把缺少的結點在陣列中的位置讓它為空

      

        這樣一來我們在陣列中就會發現會有很多位置空著在,這樣就浪費了空間,對於

       這樣的二叉樹(最壞情況):

              

        就會分配2的K次方-1個空間,造成空間的極大浪費!!

  *鏈式儲存:

    (1)儲存結構:

          1).二叉連結串列

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

             2).三叉連結串列:                
         typedef struct TriTNode {
            TElemType data;
            struct TriTNode  *lchild,*rchild;   // 左右孩子指標
            struct TriTNode  *parent;
          } TriTNode, *TriTree;


相關文章