二叉樹遍歷及C語言實現

2021-06-20 14:39:02 字數 4312 閱讀 9512

二叉樹遍歷及c

語言實現

已知中序和前序序列,或者已知中序和後序序列,都能夠構造一棵二叉樹。在本例中,本人用c

語言寫程式解答了下面兩個演算法題: (1

)給出一棵二叉樹的中序與後序遍歷序列,求出它的先序遍歷序列。 (2

)給出一棵二叉樹的中序與先序遍歷序列,求出它的後序遍歷序列。

知識點扼要回顧:

所謂二叉樹的遍歷,是指按一定的順序對二叉樹中的每個結點均訪問一次,且僅訪問一。按照根結點訪問位置的不同,通常把二叉樹的遍歷分為六種:

tlr(根左右)

, trl

(根右左)

, ltr

(左根右)

rtl(右根左)

, lrt

(左右根)

, rlt

(右左根)

其中,trl

、rtl

和rlt

三種順序在左右子樹之間均是先右子樹後左子樹,這與人們先左後右的習慣不同,因此,往往不予採用。餘下的三種順序

tlr、

ltr和

lrt根據根訪問的位置不同分別被稱為前序遍歷、中序遍歷和後序遍歷。

前序遍歷的規律是:輸出根結點,輸出左子樹,輸出右子樹;

中序遍歷的規律是:輸出左子樹,輸出根結點,輸出右子樹;

後序遍歷的規律是:輸出左子樹,輸出右子樹,輸出根結點;

不多說了,看**吧:)

#include 

#include 

using namespace std;  

//儲存節點資料,為簡便起見,這裡選用字元

typedef char   data_type;  

typedef struct tagbinary_tree_node  binary_tree_node, *lpbinary_tree_node;  

struct tagbinary_tree_node  

;  //  

//函式名稱:

treefrommidpost  

//函式功能:給出一棵二叉樹的中序與後序序列,構造這棵二叉樹。

//輸入引數:

lpbinary_tree_node & lpnode

:二叉樹的結點

//          string mid:儲存了二叉樹的中序序列的字串

//          string post:儲存了二叉樹的後序序列的字串

//          int lm, int rm:二叉樹的中序序列在陣列

mid中的左右邊界

//          int lp, int rp:二叉樹的後序序列在陣列

post

中的左右邊界

//  

void treefrommidpost(lpbinary_tree_node & lpnode, string mid, string post, int lm, int rm, int lp, int rp)  

int ileftchildlen = pos - lm;  

if (pos > lm)//有左孩子,遞迴構造左子樹

if (pos < rm)//有右孩子,遞迴構造右子樹

}  //  

//函式名稱:

treefrommidpre  

//函式功能:給出一棵二叉樹的先序與中序序列,構造這棵二叉樹。

//輸入引數

: binary_tree_node & lpnode

:二叉樹的結點

//          string mid:儲存了二叉樹的中序序列的字串

//          string pre:儲存了二叉樹的先序序列的字串

//          int lm, int rm:二叉樹的中序序列在陣列

mid中的左右邊界

//          int lp, int rp:二叉樹的先序序列在陣列

pre中的左右邊界

//  

void treefrommidpre(lpbinary_tree_node & lpnode, string mid, string pre, int lm, int rm, int lp, int rp)  

int ileftchildlen = pos - lm;  

if (pos > lm)//有左孩子,遞迴構造左子樹

if (pos < rm)//有右孩子,遞迴構造右子樹

}  //先序遍歷

void preorder(lpbinary_tree_node p)  

}  //中序遍歷

void midorder(lpbinary_tree_node p)  

}  //後序遍歷

void postorder(lpbinary_tree_node p)  

}  //釋放二叉樹

void release(lpbinary_tree_node lpnode)  

}  int main(int argc, char* argv)  ;//

//函式名稱:

treefrommidpost

//函式功能:給出一棵二叉樹的中序與後序序列,構造這棵二叉樹。

//輸入引數:

lpbinary_tree_node & lpnode

:二叉樹的結點

//          string mid:儲存了二叉樹的中序序列的字串

//          string post:儲存了二叉樹的後序序列的字串

//          int lm, int rm:二叉樹的中序序列在陣列

mid中的左右邊界

//          int lp, int rp:二叉樹的後序序列在陣列

post

中的左右邊界

//void treefrommidpost(lpbinary_tree_node & lpnode, string mid, string post, int lm, int rm, int lp, int rp)

int ileftchildlen = pos - lm;

if (pos > lm)//有左孩子,遞迴構造左子樹

if (pos < rm)//有右孩子,遞迴構造右子樹}//

//函式名稱:

treefrommidpre

//函式功能:給出一棵二叉樹的先序與中序序列,構造這棵二叉樹。

//輸入引數

: binary_tree_node & lpnode

:二叉樹的結點

//          string mid:儲存了二叉樹的中序序列的字串

//          string pre:儲存了二叉樹的先序序列的字串

//          int lm, int rm:二叉樹的中序序列在陣列

mid中的左右邊界

//          int lp, int rp:二叉樹的先序序列在陣列

pre中的左右邊界

//void treefrommidpre(lpbinary_tree_node & lpnode, string mid, string pre, int lm, int rm, int lp, int rp)

int ileftchildlen = pos - lm;

if (pos > lm)//有左孩子,遞迴構造左子樹

if (pos < rm)//有右孩子,遞迴構造右子樹

}//先序遍歷

void preorder(lpbinary_tree_node p)

}//中序遍歷

void midorder(lpbinary_tree_node p)

}//後序遍歷

void postorder(lpbinary_tree_node p)

}//釋放二叉樹

void release(lpbinary_tree_node lpnode)

}int main(int argc, char* argv)

(1)程式

1的輸入方式:

已知二叉樹的中序與後序序列,求先序序列,請先輸入中序序列,回車後輸入後序序列:

例如輸入:

dgbaechf

gdbehfca

輸出:先序遍歷結果:abdgcefh

中序遍歷結果:dgbaechf

後序遍歷結果:gdbehfca (2

)程式2

的輸入方式:

已知二叉樹的先序與中序序列,求後序序列,請先輸入先序序列,回車後輸入中序序列:

例如輸入:

abdefgc

debgfac

輸出:先序遍歷結果:abdefgc

中序遍歷結果:debgfac

後序遍歷結果:edgfbca

zz 二叉樹遍歷及C語言實現

二叉樹遍歷及c語言實現 已知中序和前序序列,或者已知中序和後序序列,都能夠構造一棵二叉樹。在本例中,本人用c語言寫程式解答了下面兩個演算法題 1 給出一棵二叉樹的中序與後序遍歷序列,求出它的先序遍歷序列。2 給出一棵二叉樹的中序與先序遍歷序列,求出它的後序遍歷序列。知識點扼要回顧 所謂二叉樹的遍歷,...

二叉樹的C語言實現及遍歷

樹是一種十分重要的基礎資料結構。很多實際問題都會抽象成樹來解決。而這篇文章要講的二叉樹則是樹中最基本又很重要的一種特殊樹。它只的是每個節點的度不大於2的樹。基於二叉樹還有很多衍生的樹。查詢樹,紅黑樹,平衡樹等等等等。二叉樹可以很形象的看做是乙個遞迴的產物。所以二叉樹的問題,基本都可以用遞迴來解決。無...

C語言實現二叉樹

1.c語言實現二叉樹中節點間最大距離 includetypedef struct treenode treenode 我們可以將所有的結點的左右子樹的高度和計算一下,然後取出最大值,就是最遠的距離。int getmaxdistance treenode root,int maxdistance in...