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
备注:具体方法参见文章 http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html
#include<iostream> #include<queue> using namespace std; typedef struct node { int id; struct node* left; struct node* right; }NODE; NODE* ConstructTree(int* post_order, int* in_order, int n_nodes) { if(n_nodes==0) return NULL; NODE* root = new NODE; root->id = post_order[n_nodes-1]; int rootIndex; for(rootIndex=0;rootIndex<n_nodes;rootIndex++) { if(in_order[rootIndex] == root->id) break; } root->left = ConstructTree(post_order,in_order,rootIndex); root->right = ConstructTree(post_order+rootIndex,in_order+rootIndex+1,n_nodes-rootIndex-1); return root; } void LevelOrder(NODE* node) { queue<NODE*> q; q.push(node); while(!q.empty()) { NODE* n = q.front(); q.pop(); if(n->left) q.push(n->left); if(n->right) q.push(n->right); if(!q.empty()) cout<<n->id<<" "; else cout<<n->id; } } int main() { int n_nodes; cin>>n_nodes; int* post_order = new int[n_nodes]; int* in_order = new int[n_nodes]; for(int i=0;i<n_nodes;i++) cin>>post_order[i]; for(int i=0;i<n_nodes;i++) cin>>in_order[i]; NODE* root = ConstructTree(post_order,in_order,n_nodes); LevelOrder(root); return 0; }