資料結構——第三章樹和二叉樹: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.