给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
题解:
我发现pta就喜欢考前序后序这种题。。。
给出后序+中序,求层次遍历
先序,后序遍历可以确定根节点。
中序遍历可以确定左子树和右子树。
不断递归就查找就可以
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=40;
int mid[maxn];
int post[maxn];
struct node{
int lson,rson;
}f[maxn];
int build(int lmid,int rmid,int lpost,int rpost){
//中序遍历 后序遍历
//后序遍历确定根
//先序,后序遍历可以确定根节点。
//中序遍历可以确定左子树和右子树。
if(lmid>rmid)return 0;
int root=post[rpost];
int fa=lmid;
while(mid[fa]!=root)fa++;//确定根
int len=fa-lmid;//确定左子树长度
f[root].lson=build(lmid,fa-1,lpost,lpost+len-1);//左子树
f[root].rson=build(fa+1,rmid,lpost+len,rpost-1);//右子树
return root;
}
void bfs(int x)
{
queue<int>q;
vector<int>v;
q.push(x);
while(!q.empty())
{
int w=q.front();
q.pop();
if(!w)break;
v.push_back(w);
if(f[w].lson)q.push(f[w].lson);
if(f[w].rson)q.push(f[w].rson);
}
int len=v.size();
for(int i=0;i<len;i++)
{
if(i!=len-1)
printf("%d ",v[i]);
else cout<<v[i];
}
return ;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>post[i];//后序
for(int i=0;i<n;i++)cin>>mid[i];//中序
int root=post[n-1];
build(0,n-1,0,n-1);
bfs(root);
return 0;
}