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

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/Nightmare_ak/article/details/84798803