P1229
遍历问题
题目描述
我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:
所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。
输入格式
输A数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。
输出格式
输出可能的中序遍历序列的总数,结果不超过长整型数。
样例 #1
样例输入 #1
abc
cba
样例输出 #1
4
要有不同的中序遍历只能发生在只有一个儿子的节点
所以等价于找只有一个儿子的节点个数
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s1,s2;
int n1,n2;
int cnt=0;
signed main() {
ios::sync_with_stdio(false);
cin>>s1>>s2;
n1=s1.size(),n2=s2.size();
s1="&"+s1,s2="."+s2;
for(int i=1; i<=n1; i++)
for(int j=2; j<=n2; j++)
if(s1[i]==s2[j]&&s2[j-1]==s1[i+1])
cnt++;
cout<<(1<<cnt);
return 0;
}