二叉樹遍歷及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...