思路:ios
【1】根據前序性質,每一顆子樹的前序第一個節點永遠是其根節點(後序也有相似性質,因此知道後序中序求前序是一個道理)。spa
【2】根據中序性質,在中序序列中,某節點以前的節點全在其左邊,反之在其右邊。code
那麼咱們在前序序列中找到當前樹根節點時,再在中序序列中找到樹根節點的位置,那麼知道中序序列中,在根節點之前的節點都是其左子樹,以後的是右子樹,這樣就能夠遞歸建這兩棵樹,這裏咱們選擇直接打印後序序列,打印順序爲遞歸左子樹,遞歸右子樹,打印自身。blog
代碼以下:遞歸
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> using namespace std; vector<int> ans; vector<int> v1,v2; void dfs(int a,int b,int cnt) { if(cnt == 1) { ans.push_back(v1[a]); return; } else if(cnt <= 0) return; int i; for(i=0;v1[a] != v2[b+i];i++); dfs(a+1,b,i); dfs(a+i+1,b+i+1,cnt-i-1); ans.push_back(v1[a]); return; } int main() { int n; while(scanf("%d",&n)!=EOF) { v1.clear(); v2.clear(); ans.clear(); int num; for(int i=0;i<n;i++) { scanf("%d",&num); v1.push_back(num); } for(int i=0;i<n;i++) { scanf("%d",&num); v2.push_back(num); } dfs(0,0,n); printf("%d",ans[0]); for(int i=1;i<ans.size();i++) printf(" %d",ans[i]); puts(""); } return 0; }