已知二叉树的后序和中序来确定二叉树
题目【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;}