PAT (Advanced Level) Practice 1119 Pre- and Post-order Traversals (30 分)
阿新 • • 發佈:2018-12-07
第一次碰到這種題目,記錄一下。
給定二叉樹的先序遍歷和後序遍歷時,有可能無法確定二叉樹,因為當一個父節點只有一個兒子節點的時候,兒子節點在右邊或左邊都是成立的。所以,當二叉樹是滿二叉樹的時候,才能確定一棵唯一的二叉樹。
#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;
}