pat 甲级 1086(树的遍历||建树)

Posted 2018zxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pat 甲级 1086(树的遍历||建树)相关的知识,希望对你有一定的参考价值。

思路1:可以用建树来做

由于是先序遍历,所以直接先序建树就行了。

技术分享图片
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 12000;
int a[maxn],n,num;
char str[20];
void build(int id)
{
    int x;
    if(num<=0) return ;
    scanf("%s",str);
    if(str[1]==u)
    {
        scanf("%d",&x);
        a[id]=x;
        num--;
        build(id*2);
        build(id*2+1);
    }
    else num--;
}
void postorder(int x)
{
    if(a[x]!=0)
    {
        postorder(x*2);
        postorder(x*2+1);
        if(num==0) printf("%d",a[x]),num=1;
        else printf(" %d",a[x]);
    }
}
int main(void)
{
    int i;
    cin>>n;
    getchar();
    num=n*2;
    build(1);
    num=0;
    postorder(1);
    return 0;
}
View Code

 

思路2:转换为前序中序遍历(参考柳神的博客)

如果输入时不带堆栈就是前序遍历,带堆栈就是中序遍历,最后转换为后序遍历。

技术分享图片
#include<iostream>
#include<vector>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
const int maxn = 12000;
vector <int> in,pre,num;
char str[20];
int n,pt=0;
void f(int root,int st,int ed)
{
    if(st>ed) return ;
    int i;
    for(i=st;i<=ed;i++) if(pre[root]==in[i]) break;
    f(root+1,st,i-1);
    f(root+(i-st)+1,i+1,ed);
    if(pt==0) printf("%d",num[pre[root]]),pt=1;
    else printf(" %d",num[pre[root]]);
}
int main(void)
{
    int i,x,id=0;
    stack <int> st;
    cin>>n;
    for(i=0;i<n*2;i++)
    {
        scanf("%s",str);
        if(str[1]==u)
        {
            scanf("%d",&x);
            num.push_back(x);
            pre.push_back(id);
            st.push(id++);
        }
        else
        {
            in.push_back(st.top());
            st.pop();
        }
    }
    f(0,0,n-1);
    return 0;
}
View Code

 

以上是关于pat 甲级 1086(树的遍历||建树)的主要内容,如果未能解决你的问题,请参考以下文章

PAT Advanced 1086 Tree Traversals Again (25) [树的遍历]

PAT甲级 1020 Tree Traversals(二叉树的遍历)

PAT甲级 1020 Tree Traversals(二叉树的遍历)

PAT 甲级 1086 Tree Traversals Again

[PAT] A1086 Tree Traversals Again

PAT A1086 Tree Traversals Again [二叉树前序中序求后序]