首页 > 代码库 > CODEVS1029 遍历问题

CODEVS1029 遍历问题

题目描述 Description

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

 

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

 
思路:最近在练dp,看到题后也想到了树型dp,但是。。。实现起来很蛋疼。。。所以就另辟蹊径,先问了同组的yfy怎么手算,她神奇的似懂非懂的把我引上了一个神奇的思路,其实中序遍历的不同主要有那些只有一个儿子的结点的个数决定,而对于一个只有一个孩子的结点来说,他在前序和后序遍历中的位置很特殊,他在前序遍历中的后面一个结点一定是他在后序遍历前面的一个结点(证明十分简单,可以自己考虑一下),这样就很容易找到这些点,因为他们的孩子可能在左右两种情况,所以总个数就是2^(只有一个儿子的结点的个数)。这种神奇的思路也能很好的用到初赛中,解决了遍历中三种遍历的转换问题。
 
code:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    char ch1[30],ch2[30];
    int l,i,j,c=0,ans;
    cin>>ch1>>ch2;
    l=strlen(ch1);
    for (i=0;i<l-1;++i)
      for (j=l-1;j>=1;--j)
        if (ch1[i]==ch2[j]&&ch1[i+1]==ch2[j-1])
          ++c;
    ans=1;
    for (i=1;i<=c;++i)
      ans*=2;
    cout<<ans<<endl;
}

CODEVS1029 遍历问题