PAT1020 Tree Traversals(后序中序求层序)

已知后序和中序,求层次遍历

法一:标准建树+BFS版

#include <iostream>
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define sca(x) scanf("%d",&x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define scl(x) scanf("%lld",&x)
#define pri(x) printf("%d\n",x)
#define pri2(x,y) printf("%d %d\n",x,y)
#define prs(x) printf("%s\n",(x))
#define prl(x) printf("%lld\n",x)
#define ll long long
#define PII pair<int,int>
#define eps 1e-6
#define inf 1e17
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e6+5;
struct node{
    int data;
    node* lson;
    node* rson;
}tree[maxn];
int n;
int pre[maxn],in[maxn],post[maxn];
node *build(int postL,int postR,int inL,int inR){
    if(postL>postR) return NULL;
    node* root=new node;
    root->data=post[postR];
    int k=inL;
    while(in[k]!=root->data)k++;
    int cntL=k-inL;
    root->lson=build(postL,postL+cntL-1,inL,k-1);
    root->rson=build(postL+cntL,postR-1,k+1,inR);
    return root;
}
void bfs(node *root){
    queue<node*>q;
    q.push(root);
    while(!q.empty()){
        node* p=q.front();
        q.pop();
        printf("%d",p->data);
        if(p->lson!=NULL) q.push(p->lson);
        if(p->rson!=NULL) q.push(p->rson);
        if(q.empty()) puts("");
        else printf(" ");
    }
}
int main(){
    sca(n);
    rep(i,0,n)sca(post[i]);
    rep(i,0,n)sca(in[i]);
    node* root=build(0,n-1,0,n-1);
    bfs(root);
    return 0;
}

法二:不建树版,参考柳神,用index+排序来写层序遍历

#include <iostream>
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define sca(x) scanf("%d",&x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define scl(x) scanf("%lld",&x)
#define pri(x) printf("%d\n",x)
#define pri2(x,y) printf("%d %d\n",x,y)
#define prs(x) printf("%s\n",(x))
#define prl(x) printf("%lld\n",x)
#define ll long long
#define PII pair<int,int>
#define eps 1e-6
#define inf 1e17
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e6+5;
struct node{
    int index,value;
};
int n;
int pre[maxn],in[maxn],post[maxn];
vector<node>v;
void dfs(int postR,int inL,int inR,int index){
    if(inL>inR) return ;
    int k=inL;
    while(in[k]!=post[postR])k++;
    v.push_back({index,post[postR]});
    dfs(postR-(inR-k+1),inL,k-1,2*index+1);
    dfs(postR-1,k+1,inR,2*index+2);
    return ;
}
bool cmp(node a,node b){
    return a.index<b.index;
}
int main(){
    sca(n);
    rep(i,0,n)sca(post[i]);
    rep(i,0,n)sca(in[i]);
    dfs(n-1,0,n-1,0);
    sort(v.begin(),v.end(),cmp);
    for(int i=0;i<v.size();i++){
        printf("%d%c",v[i].value,i==v.size()-1?'\n':' ');
    }
    return 0;
}
发布了88 篇原创文章 · 获赞 6 · 访问量 7902

猜你喜欢

转载自blog.csdn.net/kl782636177/article/details/105129754