根據(jù)二叉樹的定義,先序遍歷是先訪問根節(jié)點,然后再先序遍歷左子樹的,最后先序遍歷右子樹。因此,先序遍歷序列中的第一個節(jié)點一定是二叉樹的根節(jié)點。此外,二叉樹的中序遍歷是先中序遍歷根節(jié)點的左子樹,然后訪問根節(jié)點,最后中序遍歷根節(jié)點的右子樹,因此,在中序遍歷序列中,根節(jié)點將序列可以分成兩個子序列,根節(jié)點左邊的是左子樹所對應的中序序列,根節(jié)點右邊的是右子樹所對應的中序序列;根據(jù)這兩個子序列可以在先序遍歷序列中找到對應的左子樹和右子樹,而此時的左子樹序列的第一個節(jié)點就是左子樹的根節(jié)點,右子樹序列的第一個節(jié)點就是右子樹的根節(jié)點,這樣就可以確定左右子樹的根節(jié)點,接下來在對左右子樹的左右子樹進行劃分,如此遞歸劃分下去,當取盡先序遍歷的節(jié)點時,就唯一恢復了這個二叉樹。
同樣,由后序遍歷和中序遍歷同樣也可以唯一的確定一個二叉樹。
先序遍歷,中序遍歷確定二叉樹
void Pre_In_Order(char pred[],char ind[],int i,int j,int k, int h,BiTNode **p){
//i,j是前序遍歷的下,上界;k,h是中序遍歷的下,上界
int m;
*p=(BiTNode*)malloc(sizeof(BiTNode));
(*p)->data=pred[i];
m=k;
while(pred[i]!=ind[m]){
m++;
}
if(m==k){
//該節(jié)點的左子樹為空
(*p)->lchild=NULL;
}
else{
Pre_In_Order(pred,ind,i+1,i+m-k,k,m-1,&(*p)->lchild);
}
if(m==h){
//右子樹為空
(*p)->rchild=NULL;
}
else{
Pre_In_Order(pred,ind,i+m-k+1,j,m+1,h,&(*p)->rchild);
}
}
中序,后序確定二叉樹
void Post_In_Order(char post[],char ind[],int i,int j,int k, int h,BiTNode **p){
//i,j是后序遍歷的下,上界;k,h是中序遍歷的下,上界
int m;
*p=(BiTNode*)malloc(sizeof(BiTNode));
(*p)->data=post[j];
m=k;
while(post[j]!=ind[m]){
m++;
}
if(m==k){
//該節(jié)點的左子樹為空
(*p)->lchild=NULL;
}
else{
Post_In_Order(post,ind,i,i+m-k-1,k,m-1,&(*p)->lchild);
}
if(m==h){
//右子樹為空
(*p)->rchild=NULL;
}
else{
Post_In_Order(post,ind,i+m-k,j-1,m+1,h,&(*p)->rchild);
}
}