PAT 1020. Tree Traversals (25)

1020. Tree Traversals (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2

这道题的原理就是中序遍历加后序遍历可以确定唯一的二叉树,然后输出即可。

具体方法是,后序数组的最后一位为顶点,然后到中序遍历中找到这个顶点,划分出左子树和右子树。再到后序数组中找到对应的左子树和右子树,确定左子树顶点和右子树顶点。以此用递归的方式建立整个树。

代码如下:

#include <iostream>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
map<int,vector<int> > level;
void search(vector<int> post,vector<int> in,int l)
{
	int size=post.size();
	if(size==0)
		return;
	int root=post[size-1];
	int i,j;
	if(level.count(l)<=0)
	{
		vector<int> r;
		r.push_back(root);
		level[l]=r;
	}
	else
		level[l].push_back(root);
	vector<int> left_post;
	vector<int> left_in;
	vector<int> right_post;
	vector<int> right_in;
	for(i=0;i<size;i++)
		if(in[i]==root)
			break;
	for(j=0;j<i;j++)
		left_in.push_back(in[j]);
	for(j=i+1;j<size;j++)
		right_in.push_back(in[j]);
	for(i=0;i<size;i++)
		for(j=0;j<left_in.size();j++)
		{
			if(post[i]==left_in[j])
			{
				left_post.push_back(post[i]);
				break;
			}
		}
	for(i=0;i<size;i++)
		for(j=0;j<right_in.size();j++)
		{
			if(post[i]==right_in[j])
			{
				right_post.push_back(post[i]);
				break;
			}
		}
	search(left_post,left_in,l+1);
	search(right_post,right_in,l+1);
}
int main(int argc, char** argv) {
	int N,i,temp;
	cin>>N;
	vector<int> post;
	vector<int> in;
	for(i=0;i<N;i++)
	{
		cin>>temp;
		post.push_back(temp);
	}
	for(i=0;i<N;i++)
	{
		cin>>temp;
		in.push_back(temp);
	}
	search(post,in,0);
	map<int,vector<int> >::iterator it;
	vector<int> result;
	for(it=level.begin();it!=level.end();it++)
		for(i=0;i<it->second.size();i++)
			result.push_back(it->second[i]);
	for(i=0;i<N-1;i++)
		cout<<result[i]<<" ";
	cout<<result[N-1];
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值