给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
思路:根据后序遍历可以知道 根结点的值 ;在中序遍历中找到根结点的位置 对左右子树进行判断;又因为是后续遍历,遍历得到的是右子树,所以先建右子树
参考文章(道理相同):https://blog.csdn.net/hacker_zhidian/article/details/60770262
代码:
#include<bits/stdc++.h>
using namespace std;
const int INF = -1;
const int N = 10010;
int mid[N];//存中序遍历
int aft[N];//后续遍历
int pos;
struct Node{
int l;
int r;
int v;
}node[N];
void build(int l,int r,int n)
{
if(l>=r)//节点不存在
{
node[n].v=INF;
return ;
}
int root=aft[pos--];//从后面往前面找结点
node[n].v=root;//结点
node[n].l=2*n;//左子树
node[n].r=2*n+1;//右子树
int x=find(mid,mid+r,root)-mid;//结点在中序遍历中的位置,讨论左右
build(x+1,r,2*n+1);//因为是后序遍历 所以先建右子树
build(l,x,2*n);
}
int main()
{
int n;
cin>>n;
pos=n-1;
for(int i=0;i<n;i++)
cin>>aft[i];
for(int i=0;i<n;i++)
cin>>mid[i];
build(0,n,1);
queue<int>q;
//for(int i=0;i<n;i++)
// cout<<node[i].v<<" ";
q.push(1);
int index;
while(!q.empty())
{
index=q.front();
q.pop();
if(node[index].v!=INF)
{
if(index==1)
cout<<node[index].v;
else
cout<<" "<<node[index].v;
q.push(node[index].l);
q.push(node[index].r);
}
}
}