二叉樹的建立以及遍歷C C

2021-07-23 23:04:42 字數 3411 閱讀 2904

一、 二叉樹的定義

二叉樹(binary tree)是個有限元素的集合,該集合或者為空,或者由乙個稱為根(root)的元素及兩個不相交的、分別被稱為左子樹和右子樹的二叉樹組成。當集合為空時,稱該二叉樹為空二叉樹,在二叉樹中,乙個元素也成為乙個節點。

二、 二叉樹的資料結構

下面為二叉樹鏈式儲存結構的定義:

/*

*定義二叉樹的資料結構

*/typedef

char datatype ;

typedef

struct bitnode

bitnode , *bitree ;

三、 二叉樹的遞迴遍歷

1、 二叉樹的前序遍歷

若二叉樹為非空,則依次進行如下操作:

(1) 訪問根節點;

(2) 先序遍歷左子樹;

(3) 先序遍歷右子樹;

演算法如下:

/*

*進行二叉樹的先序遍歷

*/void preorder(bitree bt)

printf("%c " , bt->

data) ;

preorder(bt->lchild) ;

preorder(bt->rchild) ;

}

2、 二叉樹的中序遍歷

若二叉樹為非空,則依次進行如下操作:

(1)中序遍歷左子樹;

(2)訪問根節點;

(3)中序遍歷右子樹;

演算法如下:

/*

*中序遍歷二叉樹

*/void inorder(bitree bt)

inorder(bt->lchild) ;

printf("%c " , bt->

data) ;

inorder(bt->rchild) ;

}

3、 二叉樹的後續遍歷

若二叉樹為非空,則依次進行如下操作:

(1)後序遍歷左子樹;

(2)後序遍歷右子樹;

(3)訪問根節點;

演算法如下:

/*

*後序遍歷二叉樹

*/void postorder(bitree bt)

postorder(bt->lchild) ;

postorder(bt->rchild) ;

printf("%c " , bt->

data) ;

}

4、 二叉樹的層次遍歷

借助佇列的資料結構進行層次遍歷

(1) 訪問當前隊頭節點;

(2) 若該元素所指節點的左、右孩子節點非空,則將該元素所指節點的左孩子指標和右孩子指標順序入隊;

(3) 此過程不斷進行,當隊列為空時,二叉樹的層次遍歷結束;

演算法如下:

/*

*用佇列實現二叉樹的層次遍歷

*/void levelorder(bitree bt)

front = -1 ;

rear = 0 ;

quene[rear] = bt ;

while(front != rear)

if(quene[front]->rchild != null) //將隊首的右孩子節點加入佇列}}

四、 二叉樹的非遞迴遍歷

1、 二叉樹的非遞迴前序遍歷

借助棧儲存當前訪問的節點,棧為空時,訪問結束。

演算法如下:

/*

*進行二叉樹的非遞迴前序遍歷

*/void nrpreorder(bitree bt)

top = 0 ;

p = bt ;

while(p != null || top != 0)

else

p = p->lchild ; //指標指向該節點的左孩子

}if(top <= 0)

else}}

2、 二叉樹的非遞迴中序遍歷

只需將訪問節點的**移動到p = stack[top] 和 p = p->rchild 之間即可。

演算法如下:

/*

*進行非遞迴的中序遍歷

*/void nrinorder(bitree bt)

top = 0 ;

p = bt ;

while(p != null || top != 0)

else

p = p->lchild ;

}if(top <= 0)

else}}

3、 二叉樹的後序遍歷

在後序遍歷過程中,節點在第一次出棧後,還需再次入棧,也就是說節點要入兩次棧,出兩次棧。而訪問節點是在第二次出棧是進行的。因此為了區別節點出棧的次數,定義資料結構:

/*

*為二叉樹的後續遍歷建立資料結構

*/typedef

struct

stacktype ;

演算法如下:

/* *進行二叉樹的後序遍歷

*/void nrpostorder(bitree bt)

top = -1 ;

p = bt ;

while(p != null || top != -1)

else

else}}

}

五、 二叉樹的建立

由二叉樹的性質可知,二叉樹可有先序序列和中序序列唯一確定,而後序序列與中序序列無法確定唯一二叉樹。

演算法思想是:運用遞迴求解二叉樹,先根據先序序列的第乙個元素建立根節點;然後在中序序列中找到該元素,確定根節點的左、右子樹的中序序列;再在先序序列中確定左、右子樹的先序序列;最後由左子樹的先序序列與中序序列建立左子樹,由右子樹的先序序列與中序序列建立右子樹。

演算法如下:

void preino(char preorder , char inorder , int i , int j , int k , int h , bitree *bt)

else

if(m == k)

else

if(m == h)

else

}}/*

*根據二叉樹的前序遍歷序列和中序遍歷確定唯一二叉樹

*根據二叉樹的中序遍歷和後續遍歷不能確定唯一二叉樹

*/void

rebitree

(char preorder , char inorder , bitree *bt)

else

}

二叉樹建立以及遍歷

題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結果。輸入描述 輸入包括1行字串,長度不超過100。輸出描述 可能...

C C 二叉樹的建立與遍歷

在建立二叉樹的時候,當節點為葉子節點,需要將葉子節點的兩個子節點輸入0,以0作為結束識別符號。1.建立二叉樹的結構體 typedef struct tree bintree typedef bintree position struct tree 2.按照前序排序順序建立二叉樹 bintree cr...

C 二叉樹的建立以及遍歷

在筆試面試的過程中,二叉樹也是難點之一,考的也是比較多的。我也是被這個問題給難倒過,不能在乙個地方摔兩次啊!雖然這個東西第一次寫出來了,可是如果長時間不看不寫不用,還是很容易忘記的。溫故而知新,老子還是很厲害的啊,要謹記老子的話了。廢話不多說,直接上 吧!還是一樣在vc6.0上除錯過的。includ...