我们知道:
- 前序序列 = 根结点 + 左子树前序序列 + 右子树前序序列
- 后序序列 = 左子树后序序列 + 右子树后序序列 + 根结点。
如果左子树前序序列非空,那么我们可以通过前序序列得到根结点的左子结点,同理右子树后序序列非空,我们可以通过后序序列得到根结点的右子节点。我们可以等价认为非空条件为左右子树有结点,因此我们可以知道如果根结点的左右子树都非空,那么其构造的二叉树唯一。
我们再考虑左子树为空的情况,如果左子树为空,那么前序序列中根结点的右侧结点一定会和后序序列中根结点的左侧结点相同。同理右子树为空,那么也会相同。该结论互为充分必要条件。
如果出现了前序序列中根结点的右侧结点和后序序列中根结点的左侧结点相同的情况,这代表有子树是空的,但我们无法判断是哪个子树。这就出现了两种可能。
最后我们可得出结论:如果前序序列中根结点的右侧结点和后序序列中根结点的左侧结点相同,那么无法判断该相同子节点在根结点上的位置。
本身子树的前后序和根结点的前后序是嵌套的,因此我们只要遍历一下,让每个结点充当一遍根结点,判断它旁边的结点是否相同即可。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s1, s2;
cin >> s1 >> s2;
int ans = 1;
for (int i = 0; i < s1.size() - 1; ++i) {
if (s1[i + 1] == s2[s2.find(s1[i]) - 1]) ans *= 2;
}
cout << ans << "\n";
}