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.
思路:
根据中序遍历(lchild、root、rchild),后续遍历(lchild、rchild、root)的顺序构造出原来的二叉树,再按照层序遍历的方式访问元素值。
代码如下:
#include<iostream>
#include<vector>
#include<queue>
#define maxsize 100
using namespace std;
int post[maxsize];
int in[maxsize];
typedef struct Node{
int data;
struct Node* lchild;
struct Node* rchild;
}Node;
queue<Node*> level;
vector<int> value;
void create(int l1,int r1,int l2,int r2,Node* &root){
root =new Node();
int i;
for(i=l2;i<r2;i++)
if(in[i]==post[r1])
break;
root->data=in[i];
if(i==l2)
root->lchild=NULL;
else
create(l1,l1+i-1-l2,l2,i-1,root->lchild);
if(i==r2)
root->rchild=NULL;
else
create(r1-(r2-i),r1-1,1+i,r2,root->rchild);
}
void findlevel(Node* &tree){
level.push(tree);
while(!level.empty()){
Node* q=level.front();
level.pop();
value.push_back(q->data);
if(q->lchild!=NULL)
level.push(q->lchild);
if(q->rchild!=NULL)
level.push(q->rchild);
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>post[i];
for(int i=0;i<n;i++)
cin>>in[i];
Node *root;
create(0,n-1,0,n-1,root);
findlevel(root);
cout<<value[0];
for(int i=1;i<value.size();i++)
cout<<" "<<value[i];
return 0;
}
样例结果如下: