【洛谷P1229】遍历问题

这道题好巧

遍历问题

题目描述

我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:

所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。

输入格式

共两行,第一行表示该二叉树的前序遍历结果 \(s_1\),第二行表示该二叉树的后序遍历结果 \(s_2\)

保证至少存在一棵二叉树满足给出的信息,\(s _ 1, s _ 2\) 中只含小写字母,且在某个字符串中不存在相同的字母。

输出格式

输出可能的中序遍历序列的总数,结果不超过 \(2^{63}-1\)

样例 #1

样例输入 #1

abc                           
cba

样例输出 #1

4

解法&&个人感想

首先 我们注意到,只有一个孩子的节点会由两种情况
其次 有一个性质:AB和BA倒序出现只有一个孩子
下面看代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string a,b;
int ans;
int main(){
    cin>>a>>b;
    int l=a.length();
    for(int i=0;i<=l-1;i++){
        for(int j=1;j<=l-1;j++){
            if(a[i]==b[j]&&a[i+1]==b[j-1]) ans++;
        }
    }
    printf("%lld",1<<ans);
    system("pause");
    return 0;
}
posted @ 2025-02-11 00:35  elainafan  阅读(37)  评论(0)    收藏  举报