在已有的题解中,没有十分详细的剖析为什么是i=0且j=1 的情况的,而我写了一个,也普及了位运算,以下是题解。
关于本题的补充的点
这个题的解题思路就是找到子节点只有一个的结点,由于排列组合的原理我们能轻松的得出此题的答案就是2的x次方,其中x为子结点只有一个的点。
而子结点只有一个的点该怎么去找呢,很简单,就是比如说BA和AB吧,我们先定位A然后去定位B的位置,由于A只有一个子结点,那么不会有另一个来碍事(不然的话就不是AB了而是别的,因为后序的话有左有右不可能先输出中间的满结点)
如果不理解可以写一个模拟一下,比如
pre:1245637
post:7326541
这个二叉树就有两个子结点只有一个的结点
那么不难得出代码
if(pre[i]==post[j]&&pre[i+1]==post[j-1])
ans++;
那么我说的难懂的地方究竟在哪里呢?
先上代码,其中l为字符串的长度。
for(int i=0;i<l;i++)
for(int j=1;j<l;j++)
为什么j=1?而i=0?为什么不能写成i=0而j=0或者i=1且j=0
1.我们先来说i=0且j=0:
首先我们讨论一个二叉树

在这个二叉树中我们不难写出其pre为ACDEB 其post为BEDCA
如果我们按照i=0&&j=0的思路来做的话,会发现虽然根结点为满,但是符合pre为AC post为CA的情况,显然与事实不符,故而肯定不对。
2.为什么i=1且j=0不对?
显然我们知道post的最后一个为根结点,pre第一个为根结点,如果要是写成这样的话,乍一看似乎就算了一次根结点应该没有问题,而事实上我们忽略了一种情况,而这样的情况呢,如下图所示。

显然,这样的二叉树也存在,并且也有子结点为一个的点,而我们跑了代码之后呢? 完了,答案为0! 为什么会这样?
答案就是!我们把pre中的根结点压根没进行计算(i=1),就会出现pre中没有A的情况,那么还哪来的AB和BA呢?
这样的话,你就会爆两个点,拿到80pts的高分
最后呢再说一个知识点叫位运算,这个题用pow不太好,所以我们结合计算机二进制的特性,搞了个位运算,目前初学者只用记住(1<<x)=2^x就行,而详细的内容则可以自己查询。
附AC代码
#include<iostream>
using namespace std;
string pre,post;
int ans;
int main()
{
cin>>pre>>post;
int l=pre.length();
for(int i=0;i<l;i++)
for(int j=1;j<l;j++)
if(pre[i]==post[j]&&pre[i+1]==post[j-1])
ans++;
cout<< ( 1 << ans)<<endl;
return 0;
}
``