USACO3.4.1--American Heritage

chunlvxiong的博客


题目描述:

  给出二叉树的中序遍历和前序遍历,输出其后序遍历(节点按照字母读入,因而最多26个节点)。

思考&分析:

  其实这是初赛要考的内容。以中序遍历为ABEDFCHG,前序遍历为CBADEFGH为例进行说明:

  根节点为C,然后ABEDF为其左子树,HG为其右子树。

  对于ABEDF这棵子树,对应前序遍历为BADEF,所以B为根,A为其左子节点,EDF为其右子树。

  对于EDF这棵子树,对应前序遍历为DEF,所以D为根,E为其左子节点,F为其右子节点。

  所以EDF的后序遍历为EFD,ABEDF的后序遍历为AEFDB。

  对于HG这棵子树,对应前序遍历为GH,所以G为根,H为其左子节点。

  所以HG的后序遍历为HG,所以ABEDFCHG的后序遍历为AEFDBHGC。

  --类似地,可以通过后序遍历和中序遍历得到前序遍历。

贴代码:

  这里先预处理好节点在中序遍历中的位置,以便快速划分,并采取递归形式,较为好写。

#include <bits/stdc++.h>
using namespace std;
char s[105],t[105];
int n,wz[105];
void dfs(int Lt,int Rt,int Ls,int Rs){
    if (Lt>Rt || Ls>Rs) return;
    dfs(Lt+1,Lt+wz[t[Lt]-'A']-Ls,Ls,wz[t[Lt]-'A']);
    dfs(Lt+1+wz[t[Lt]-'A']-Ls,Rt,wz[t[Lt]-'A']+1,Rs);
    putchar(t[Lt]);
}
int main(){
    freopen("heritage.in","r",stdin);
    freopen("heritage.out","w",stdout);
    scanf("%s",&s),n=strlen(s);
    for (int i=0;i<n;i++) wz[s[i]-'A']=i;
    scanf("%s",&t);
    dfs(0,n-1,0,n-1);
    puts("");
    return 0;
}
posted @ 2017-08-24 09:33  chunlvxiong  阅读(165)  评论(0编辑  收藏  举报