二叉樹(1)——定義,性質及結構

一 

二叉樹定義:

滿足以下三個條件

1,根節點

2,去跟,分成兩個不相交的集合TL和TR

3,TL和TR也爲二叉樹(遞歸定義)

基本形態:

由三個節點構成的二叉樹的個數

性質:

1,第i層有2^(i-1)個節點

2,深度爲k的二叉樹,做多爲 2^(k)-1個節點

      k層二叉樹有2^(k)-1個節點,叫蠻二叉樹

3,度爲0的節點的個數爲n0

      度爲1的節點的個數爲n1

      度爲2的節點的個數爲n2

      則n0=n2+1

     推導過程:

     設節點總數爲n,分支數爲b

     則:

    n=n0+n1+n2

    b=n1+2n2

    b=n-1

4,假如一棵包含 n 個結點的二叉樹中每個結點都可以和滿二叉樹中編號爲1至 n 的結點一、一對應,則稱這類二叉樹爲完全二叉樹

      n個節點的完全二叉樹,深度爲[log2 n]+1

5,完全二叉樹中,編號爲i的節點,左孩子編號爲2i,有孩子爲2i+1,雙親編號爲floor(i/2)

存儲結構

1,順序 先補成完全二叉樹

const MAXSIZE = 100;  // 暫定二叉樹中結點數的最大值爲100
  typedef struct {
   ElemType *data;    // 存儲空間基址(初始化時分配空間)
   int nodeNum;     // 二叉樹中結點數
  } SqBiTree;       // 二叉樹的順序存儲結構 

2,鏈式

二叉鏈表:

左孩子域和右孩子域

typedef struct BiTNode { 
   ElemType data; 
   struct BiTNode *Lchild, *Rchild; // 左、右孩子指針 
  } *BiTree;



三叉鏈表:

typedef struct TriTNode {
   ElemType data;
   struct BiTNode *Lchild, *Rchild; // 左、右孩子指針
   struct BiTNode *parent;     // 雙親指針
  } *TriTree;

雙親鏈表

const MAXSIZE = 100;        // 暫定二叉樹中結點數的最大值爲100
  typedef struct BPTNode {        // 結點結構
   ElemType data;
   int *parent;              // 指向雙親的指針 
   char LRTag;               // 左、右孩子標誌域
  } BPTNode
  typedef struct BPTree{         // 樹結構 
   BPTNode *nodes;             // 初始化時分配存儲空間
   int nodeNum;              // 結點數目 
   int root;               // 根結點的位置
  } BPTree
   cin>>BT.nodeNum;            // 輸入結點數目
   BT.root=0;
   cin>> BT.nodes[0].data;         // 輸入根
   BT.nodes[0].parent = -1;        // 根的雙親爲空
   BT.nodes[0].LRTag = 'L'; 
   for (i=1; i<BT.nodeNum; i++)
   {
    cin>> BT.nodes[i].data >> F >>BT.nodes[i].LRtag;
    k=i-1;
    while (k>=0 && BT.nodes[k].data != F) k--; // 查詢雙親
    if (k<0) return FALSE;        // 沒有找到雙親
    BT.nodes[i].parent = k;
    return TRUE;
   }
  }



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