我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:
所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。
输入描述 Input Description
输入文件共2行,第一行表示该树的前序遍历结果,第二行表示该树的后序遍历结果。输入的字符集合为{a-z},长度不超过26。
输出描述 Output Description
输出文件只包含一个不超过长整型的整数,表示可能的中序遍历序列的总数。
样例输入 Sample Input
abc
cba
样例输出 Sample Output
4
写完代码整个人都不好了啊QAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ
首先:中序遍历之所以不同,就是因为那些只有一个儿子的节点,他的儿子可以“左偏”,也可以“右偏”(2种情况)。
其次:只有一个儿子的节点,它前序遍历中的后一个节点一定是它后序遍历的前一个节点。
所以,数出这些节点的数量c,答案就是2的c次方。
(一道区间DP就这样被非DP水过了好开心啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int main(){ 6 char ch1[30],ch2[30]; 7 cin>>ch1>>ch2; 8 int l=strlen(ch1),c=0; 9 for (int i=0;i<l-1;++i) 10 for (int j=l-1;j>=1;--j) 11 if (ch1[i]==ch2[j]&&ch1[i+1]==ch2[j-1]) 12 ++c; 13 long long ans=1ll<<c; 14 cout<<ans<<endl; 15 }