版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84798803
第一次碰到这种题目,记录一下。
给定二叉树的先序遍历和后序遍历时,有可能无法确定二叉树,因为当一个父节点只有一个儿子节点的时候,儿子节点在右边或左边都是成立的。所以,当二叉树是满二叉树的时候,才能确定一棵唯一的二叉树。
#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;
}