【二叉树的确定 :三种遍历】

已知二叉树的后序和中序来确定二叉树

题目【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;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值