/*
本题解参考自:http://blog.youkuaiyun.com/wuchuanpingstone/article/details/6860453
已知二叉树的中序遍历和后序遍历,求出其先序遍历
输入 Input
输入有两行,第一行为二叉树的中序遍历
第二行为二叉树的后序遍历
输出 Output
输出有一行,输出二叉树的先序遍历
样例输入 SampleInput
dgbaechf
gbdehfca
样例输出 SampleOutput
adbgcefh
*/
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 20;
// 二叉树存储结构
typedef struct tNode
{
char data;
struct tNode *lChild,*rChild;
} tNode, *bt;
// 通过中后序构建二叉树
void in_post_to_bt(char *in, char *post, int len, bt &T)
{
int k;
if(len<=0)
{
T = NULL;
return;
}
for(char *temp = in; temp<in+len; temp++)
{
if(*temp == *(post+len-1)) // 查找根结点(后序最后一个元素即为根结点)
{
k = temp - in; // 记录根结点在中序内的位置
T = new tNode;
T->data = *temp; // 构建结点
break;
}
}
// 构建左子树
in_post_to_bt(in,post,k,T->lChild);
// 构建右子树
in_post_to_bt(in+k+1,post+k,len-k-1,T->rChild);
}
// 先序遍历二叉树
void PreOrderTraverse(bt T)
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lChild);
PreOrderTraverse(T->rChild);
}
}
int main()
{
bt Tree; // 二叉树Tree
char in[MAX]; // Tree的中序遍历
char post[MAX]; // Tree的后序遍历
cin>>in>>post; // 输入Tree的中后序遍历
// 构建Tree
in_post_to_bt(in,post,strlen(in),Tree);
// 先序遍历Tree
PreOrderTraverse(Tree);
return 0;
}
Exercise(22):二叉树的层序遍历

