【二叉树】POJ 2255

来源:互联网 发布:乐视电视显示网络异常 编辑:程序博客网 时间:2024/06/06 02:28

题意很简单,给出一棵树的前序&中序遍历,输出后续遍历。

首先我们来研究一下第一个sample:

DBACEGF        ABCDEFG

前序遍历是先是从根节点->左子树->右子树;而中序遍历则是左子树->根节点->右子树。所以DBACEGF中D是根, ABC DEFG 中序可以找左子树&右子树,此时把D放在输出数组的最后一个,然后先递归处理右子树再处理左子树。

#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout)#define N 30char pre[N];char in[N];char ans[N];int len;void gao(int s1, int s2, int t1, int t2){    int i;    if(s1 > s2)return ;    for(i = t1; i <= t2; i++){        if(in[i] == pre[s1]){            break;        }    }    ans[--len] = pre[s1];    if(s1 == s2){        return ;    }    gao(s1 + i - t1 + 1, s2, i + 1, t2);    gao(s1 + 1, s1 + i - t1, t1, i - 1);}int main(){    while(scanf("%s%s",pre,in) != EOF){        int i,j;        len = strlen(pre);        memset(ans,'\0',sizeof(ans));        gao(0,len - 1,0,len - 1);        printf("%s\n",ans);    }    return 0;}


原创粉丝点击