1. 程式人生 > >PAT (Advanced Level) Practice 1119 Pre- and Post-order Traversals (30 分)

PAT (Advanced Level) Practice 1119 Pre- and Post-order Traversals (30 分)

第一次碰到這種題目,記錄一下。
給定二叉樹的先序遍歷和後序遍歷時,有可能無法確定二叉樹,因為當一個父節點只有一個兒子節點的時候,兒子節點在右邊或左邊都是成立的。所以,當二叉樹是滿二叉樹的時候,才能確定一棵唯一的二叉樹。

#include<cstdio>
#include<vector>
using namespace std;

const int N=30+5;

int dfn,key[N],ch[N][2],f,pre[N],post[N];
vector<int> ans;

int build(int l,int r,int L,int
R) { if(r<l) return 0; int now=++dfn;key[now]=pre[l]; for(int i=L;i<R;i++) if(post[i]==pre[l+1]) { int len=i-L; int ls=build(l+1,l+len+1,L,i); int rs=build(l+len+2,r,i+1,R); if(ls) ch[now][0]=ls; else f=0; if
(rs) ch[now][1]=rs; else f=0; break; } return now; } void dfs(int u) { if(ch[u][0]) dfs(ch[u][0]); ans.push_back(key[u]); if(ch[u][1]) dfs(ch[u][1]); } int main() { dfn=0,f=1; int n;scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d"
,pre+i); for(int i=0;i<n;i++) scanf("%d",post+i); build(0,n-1,0,n-1); if(f) puts("Yes"); else puts("No"); dfs(1); for(int i=0;i<ans.size();i++) printf("%d%c",ans[i]," \n"[i+1==ans.size()]); return 0; }