继POJ2255之后纠结了很久。。,看了某本书后对于二叉树有了新的更深一点的认识。。。。
对于二叉树T,可以递归定义它的前序遍历、中序遍历和后序遍历如下:
PreOrder(T)=T的根节点+PreOrder(T的左子树)+PreOrder(T的右子树);
InOrder(T)=InOrder(T的左子树)+T的根节点+InOrder(T的右子树);
PostOrder(T)=PostOrder(T的左子树)+PostOrder(T的右子树)+T的根节点;
其中加号表示字符串连接运算。
POJ2255简化的代码:
#include<iostream>
#include<string>
using namespace std;
char s1[27],s2[27],ans[27];
void build(int n,char *s1,char *s2,char *s)
{
if(n<=0) return;
int p=strchr(s2,s1[0])-s2;
build(p,s1+1,s2,s);
build(n-p-1,s1+p+1,s2+p+1,s+p);
s[n-1]=s1[0];
}
int main()
{
while(scanf("%s%s",s1,s2)==2)
{
int n=strlen(s1);
build(n,s1,s2,ans);
ans[n]='\0';
printf("%s\n",ans);
}
return 0;
}