题目描述:
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
输入:
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。二叉树中的结点名称以大写字母表示:最多26个结点
输出:
输入样例可能有多组,对于每组测试样例,输出一行,为后序遍历的字符串。
样例输入:
ABC
BAC
FDXEAG
XDEFAG
样例输出:
BCA
XEDGAF
算法分析:
先根据先序遍历与中序遍历可以唯一确定一棵二叉树,运用递归的算法构造出二叉树。然后在后序遍历即可。
源代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct TNode{
char data;
struct TNode *lchild;
struct TNode *rchild;
}Tree[50];
char str1[30];
char str2[30];
int loc;
TNode *create(){
Tree[loc].lchild = Tree[loc].rchild = NULL;
return &Tree[loc++];
}
TNode* build(int s1,int e1,int s2,int e2){
TNode *ret = create();
ret->data = str1[s1];
int rootidx;
for(int i = s2 ; i <= e2 ; i++){
if(str1[s1] == str2[i]){
rootidx = i;
break;
}
}
if(rootidx != s2) // 有左子树
ret->lchild = build(s1+1,s1+(rootidx-s2),s2,rootidx-1);
if(rootidx != e2)
ret->rchild = build(s1+1+(rootidx-s2),e1,rootidx+1,e2);
return ret;
}
void postOrder(TNode* root){
if(root != NULL){
postOrder(root->lchild);
postOrder(root->rchild);
printf("%c",root->data);
}
}
int main(){
freopen("11in.txt","r",stdin);
while(scanf("%s",str1)!=EOF){
scanf("%s",str2);
loc = 0;
int len1 = strlen(str1);
int len2 = strlen(str2);
TNode *root = build(0,len1-1,0,len2-1);
postOrder(root);
printf("\n");
}
return 0;
}