题目描述
我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:
所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。
输入格式
共两行,第一行表示该二叉树的前序遍历结果 s1,第二行表示该二叉树的后序遍历结果 s2。
输出格式
输出可能的中序遍历序列的总数,结果不超过 263−1263−1。
输入输出样例
输入
abc cba
输出
4
题目分析
稍微想了想会出现不同中序遍历的原因:左右子树不确定;而根节点只有一个,那答案应该就是- 1(错得离谱mmd)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define ll long long
const int N = 2000;
ll cnt;
char s1[N], s2[N];
int main() {
scanf("%s %s", s1, s2);
int len = strlen(s1) - 1;
cnt = (ll)pow(2, len);
return 0;
}
一交,全WA;得,在看看;(左右子树不确定;而根节点只有一个。。。)得,是只有一个子节点的节点才会在知道 前序后序 的情况下有不同的中序遍历,那么就判断有多少个单节点再计算即可而先序遍历中,如果A只有一个子树B,那么在先序遍历中A一定在B前,在后序遍历中B一定在A前
代码示例
#include <stdio.h>
#include <string.h>
#include <math.h>
#define ll long long
const int N = 2000;
ll cnt;
char s1[N], s2[N];
int main() {
scanf("%s %s", s1, s2);
int len = 0;
for(int i = 0 ;i < (int)strlen(s1); i++){
for(int j = 1; j < (int)strlen(s2); j++) {
if(s1[i] == s2[j] && s1[i + 1] == s2[j - 1]) len++;
}
}
cnt = (ll)pow(2, len);
printf("%lld\n", cnt);
return 0;
}