题目大意:给出先序遍历和中序遍历的结果,求后序遍历。
采用递归算法:依次选取先序字符串,以选取字符为界限分割中序字符串为左子树和右子树,分别递归,直至不可分割。
#include <iostream>
#include <string>
using namespace std;
#define maxn 110
char strpre[maxn],strin[maxn],strpost[maxn];
int cnt;
void Build(int &pos,int l,int r)
{
if(l>r) return;//不存在节点,返回;l=r时,存在唯一节点,即叶子节点
char ch=strpre[pos++];
for(int i=l;i<=r;i++)
if(ch==strin[i])
{
Build(pos,l,i-1);
Build(pos,i+1,r);
strpost[cnt++]=ch;
}
}
int main()
{
while(~scanf("%s%s",strpre,strin))
{
cnt=0;
int pos=0;
Build(pos,0,strlen(strpre)-1);
strpost[cnt]='\0';
printf("%s\n",strpost);
}
return 0;
}
while(~scanf()) 可以优化运行时间,还未找到学习资料。
声明字符串有string库函数和数组存储,string类型的字符串cin输入时(别的输入方法还未了解),字符串时不能含空格;字符串数组注意‘\0’的添减。
c++的输入输出方式是操作符的重载,c语言的输入输出方式好,方便高效。