1020. Tree Traversals (25)
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 7Sample 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];
}