1. 程式人生 > >資料結構——第三章樹和二叉樹:02二叉樹

資料結構——第三章樹和二叉樹:02二叉樹

1.二叉樹的儲存結構:

(1)二叉樹的順序儲存表示:

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

typedef TElemType SqBiTree[MAX_TREE_SIZE]; 

SqBiTree bt;

(2)二叉樹的鏈式儲存表示:

①二叉連結串列:

typedef struct BiTNode //結點結構

{

  TElemType data;

  struct BiTNode *lchild, *rchild; //左右孩子指標

} BiTNode, *BiTree;

②三叉連結串列:如要找某個結點的父結點,在三叉連結串列中很容易實現,在二叉連結串列中則需從根指標出發一一查詢。

typedef struct TriTNode //結點結構

{

  TElemType data;

  struct TriTNode *lchild, *rchild; //左右孩子指標

  struct TriTNode *parent; //雙親指標

} TriTNode, *TriTree;

③線索連結串列:

 

2.若一個二叉樹中含有n個結點,則它的二叉連結串列中必含有2n個指標域,其中必有n + 1個空的鏈域。

證明:分支數目B = n - 1,即非空的鏈域有n - 1個,空鏈域有2n - (n - 1) = n + 1個。

3.二叉樹的遍歷:順著某一條搜尋路徑巡防二叉樹中的結點,使得每個結點均被訪問一次,而且僅被訪問一次。對於二叉樹可以有三條搜尋路徑:先上後下的按層次遍歷;先左(子樹)後右(子樹)的遍歷;先右子樹後左子樹的遍歷。

(1)先左後右的遍歷演算法:遞迴操作

①先根遍歷:若二叉樹為空樹,則空操作;否則,訪問根結點->先序遍歷左子樹->先序遍歷右子樹。

先根遍歷的遞迴演算法描述:

void Preorder(BiTree T)

{

  if (T)

  {

    visit(T->data); //訪問根結點

    Preorder(T->lchild); //遍歷左子樹

    Preorder(T->rchild); //遍歷右子樹

  }

}

②中根遍歷:若二叉樹為空樹,則空操作;否則,中序遍歷左子樹->訪問根結點->中序遍歷右子樹。

③後根遍歷:若二叉樹為空樹,則空操作;否則,後序遍歷左子樹->後序遍歷右子樹->訪問根結點。

4.

5.

6.

7.

8.

9.

10.