L2-006 树的遍历 (25 分)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数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);
		}
	}
}

 

posted @ 2019-03-19 19:25  是妖妖灵鸭  阅读(140)  评论(0编辑  收藏  举报