已知二叉樹的前序走訪和中序遍曆,求二叉樹的後序遍曆。演算法很簡單,由前序走訪的第一個元素可確定左、右子樹的根節點,參照中序遍曆又可進一步確定子樹的左、右子樹元素。如此遞迴地參照兩個遍曆序列,最終構造出二叉樹。自己寫了一段C語言的數組版,加了注釋,應該很好理解。
由二叉樹的前序走訪和中序遍曆序列能唯一確定一棵二叉樹。
前序走訪為:訪問根節點、訪問左子樹、訪問右子樹;
中序遍曆為:訪問左子樹、訪問根節點、訪問右子樹。
後序遍曆為:訪問左子樹、訪問右子樹、訪問根節點。
#include <stdio.h>
#include <string.h>
char preord[100],inord[100];
void rebuild(int preleft,int preright,int inleft,int inright)
{
int root,leftsize,rightsize;
if(preleft<=preright&&inleft<=inright)
{
//在中序遍曆中尋找根節點
for(root=inleft;root<=inright;root++)
{
if(preord[preleft]==inord[root]) break;
}
//計算左右子樹大小
leftsize=root-inleft;
rightsize=inright-root;
//如果有左子樹則遞迴重建左子樹
if(leftsize>0)
{
rebuild(preleft+1,preleft+leftsize,inleft,root-1);
}
//如果有右子樹則遞迴重建右子樹
if(rightsize>0)
{
rebuild(preleft+leftsize+1,preright,root+1,inright);
}
//如果無子樹則列印根節點
printf("%c",inord[root]);
}
}
int main()
{
int length;
scanf("%s%s",preord,inord);
length=strlen(preord)-1;
rebuild(0,length,0,length);
return 0;
}