一个二叉树,树中每个节点的权值互不相同。
现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。
输入格式
第一行包含整数 N,表示二叉树的节点数。
第二行包含 N 个整数,表示二叉树的后序遍历。
第三行包含 N 个整数,表示二叉树的中序遍历。
输出格式
输出一行 N 个整数,表示二叉树的层序遍历。
数据范围
1≤N≤30
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
答案:
法一:
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
#define pb push_back
const int N = 1e5 + 10;
const int M = 1e3 + 10;
using namespace std;
struct node{
int id;
node *l,*r;
};
int n;
int mid[35];
int post[35];
node *create(int len,int *post,int *mid){
node *root = new node;
if(!len) return root=NULL;
int pos=post[len-1];
int pp;
for(int i=0;i<n;i++){
if(mid[i]==pos){
pp=i;
break;
}
}
root->id=pos;
root->l=create(pp,post,mid);
root->r=create(len-pp-1,post+pp,mid+pp+1);
return root;
}
void cengxu(node *root){
queue<node *>q;
q.push(root);
int tot=0;
while(!q.empty()){
node *top=q.front();
tot++;
q.pop();
if(top->l) q.push(top->l);
if(top->r) q.push(top->r);
if(tot<n) cout<<top->id<<" ";
if(tot==n) {
cout<<top->id<<endl;
break;
}
}
}
//void midd(node *root){
// if(root){
// midd(root->l);
// cout<<root->id<<" ";
// midd(root->r);
// }
//}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>post[i];
for(int i=0;i<n;i++) cin>>mid[i];
node *root=create(n,post,mid);
//midd(root);
cengxu(root);
return 0;
}
法二:
#include <bits/stdc++.h>
const int N = 600;
using namespace std;
int hou[40],in[40],t,n;
struct node
{
int v;
struct node *l,*r;
};
struct node * chan(int l,int r)
{
int flag=-1;
for(int i=l;i<=r;i++)
{
if(in[i]==hou[t]) flag=i;
}
if(flag==-1) return NULL;
struct node * k=new node;
k->l=NULL;k->r==NULL;
k->v=in[flag];
t--;
if(flag<r) k->r=chan(flag+1,r);
if(flag>l) k->l=chan(l,flag-1);
return k;
}
void ceng(struct node*root)
{
queue<struct node *> q;
q.push(root);
int f=0;
while(!q.empty())
{
struct node *s=q.front();
if(f)printf(" %d",s->v);
else printf("%d",s->v),f++;
q.pop();
if(s->l!=NULL) q.push(s->l);
if(s->r!=NULL) q.push(s->r);
}
printf("\n");
}
int main( )
{
cin>>n;
for(int i=0;i<n;i++)
scanf("%d",&hou[i]);
for(int i=0;i<n;i++)
scanf("%d",&in[i]);
t=n-1;
struct node * tree=chan(0,n-1);
ceng(tree);
return 0;
}