题目
时间限制: 1 Sec 内存限制: 64 MB
题目描述
无
输入
第1行:二叉树的前序遍历顺序 第2行:后序遍历顺序
输出
第1行:1个整数,表示所有可能的二叉树的数量
样例输入
ABC
CBA
样例输出
4
分析
令先序遍历为
定义状态
转移
对于
所以,要找出
能确定的是:
所以,在
由于在先序中,一个子树一定是连续的一个串,所以在根右边的
所以:
边界
当只有两个结点时,显然return 2
。
只有一个结点,return 1
。
当子树为空时,return 2
(处理之前说的“移栽”的情况)。
当找不到
代码
#include<cstdio>
#include<cstring>
#define MAXN 26
char s1[MAXN+5],s2[MAXN+5];
int N;
int Find(char t,int l,int r)
{
for(int i=l;i<=r;i++)
if(s2[i]==t)
return i;
return MAXN+2;//找不到p
}
int dfs(int l1,int r1,int l2,int r2)
{
if(r2<l2) return 2;
if(r2-l2+1<=2) return r2-l2+1;//结点数<=2
int p=Find(s1[l1+1],l2,r2);
return dfs(l1+(p-l2+1)+1,r1,p+1,r2-1)*
dfs(l1+1,l1+(p-l2+1),l2,p);
}
int main()
{
scanf("%s%s",s1+1,s2+1);
N=strlen(s1+1);
printf("%d",dfs(1,N,1,N));
}