題意很簡單,給出一棵樹的前序&中序遍曆,輸出後續遍曆。
首先我們來研究一下第一個sample:
DBACEGF ABCDEFG
前序走訪是先是從根節點->左子樹->右子樹;而中序遍曆則是左子樹->根節點->右子樹。所以DBACEGF中D是根, ABC D
EFG 中序可以找左子樹&右子樹,此時把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;}