【算法分析】
s1是前序遍历字符串,s2是中序遍历字符串。构造一个函数build(int l1,int r1,int l2,int r2),通过在s2中找s1的第一个节点,也就是根节点,把它赋值给p,把s1分成左右子树。左子树是l1+1到l1+p-l2,右子树是l1+p-l2+1到r1。s2的左子树是l2到p-1,右子树是p+1到r2。
如果p>l2,递归调用build(l1+1,l1+p-l2,l2,p-1),如果p<r2,递归调用build(l1+p-l2+1,r1,p+1,r2)。累加到c[l1],直到叶子结点,c[l1]=1。这样就可以统计出每个节点的有多少个叶子结点。
然后通过循环遍历s1,输出每个节点重复的值。
【参考代码】
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
string s1,s2;
int c[205];
int build(int l1,int r1,int l2,int r2){
if(l1==r1){//到达叶子
c[l1]=1;return c[l1];
}
int p=s2.find(s1[l1]);
if(p>l2) c[l1]+=build(l1+1,l1+p-l2,l2,p-1);
if(p<r2) c[l1]+=build(l1+p-l2+1,r1,p+1,r2);
return c[l1];
}
int main()
{
cin>>s1>>s2;
build(0,s1.length()-1,0,s2.length()-1);
for(int i=0;i<s1.length();i++){
for(int j=1;j<=c[i];j++) cout<<s1[i];
cout<<endl;
}
return 0;
}
find()函数