1. 程式人生 > >【二叉樹的確定 :三種遍歷】

【二叉樹的確定 :三種遍歷】

已知二叉樹的後序和中序來確定二叉樹

題目【L2-006 樹的遍歷】

 #include<bits/stdc++.h>
using namespace std;

const int N = 1e5+11;

typedef struct Tree{
    int val;
    struct Tree *lson;
    struct Tree *rson ;
}tree,*ptree;

int post[N],in[N];
ptree Build(int postl,int postr,int inl,int inr){
    if(postl>postr) return
NULL; ptree rt= new Tree(); int i;for(i=inl;i<=inr;i++) if(in[i]==post[postr]) break; int num=i-inl; rt->val=in[i]; rt->lson=Build(postl,postl+num-1,inl,i-1); rt->rson=Build(postl+num,postr-1,i+1,inr); return rt; } int have; void bfs(ptree rt){ queue<ptree>
que; que.push(rt); while(!que.empty()){ ptree u =que.front(); que.pop(); if(have++) cout<<" "; cout<<u->val; if(u->lson) que.push(u->lson); if(u->rson) que.push(u->rson); } } int main(){ int n;cin>>n; for(int
i=1;i<=n;i++) cin>>post[i]; for(int i=1;i<=n;i++) cin>>in[i]; ptree rt=Build(1,n,1,n); have=0; bfs(rt); return 0;}

已知二叉樹的前序和中序遍歷來確定二叉樹

題目【L2-011 玩轉二叉樹】

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+11;

typedef struct Tree{
    int val;
    struct Tree *lson;
    struct Tree *rson ;
}tree,*ptree;

int pre[N],in[N];
ptree Build(int prel,int prer,int inl,int inr){
    if(prel>prer) return NULL;
    ptree rt = new Tree();
    int i; for(i=inl;i<=inr;i++) if(in[i]==pre[prel]) break;
    int num=i-inl;
    rt->val=in[i];
    rt->lson=Build(prel+1,prel+num,inl,i-1);
    rt->rson=Build(prel+num+1,prer,i+1,inr);
    return rt;
}

int have;
void bfs(ptree rt){
    queue<ptree>que;
    que.push(rt);
    while(!que.empty()){
        ptree u =que.front(); que.pop();
        if(have++) cout<<" ";
        cout<<u->val;
        if(u->rson) que.push(u->rson);
        if(u->lson) que.push(u->lson);
    }
}

int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>in[i];
    for(int i=1;i<=n;i++) cin>>pre[i];
    ptree rt=Build(1,n,1,n);
    have=0; bfs(rt);
return 0;}