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 7
Sample Output:
4 1 6 3 5 7 2
题型分类:树的遍历、建树
题目大意:给出后序遍历和中序遍历,要求输出层序遍历的序列。
解题思路:由后序遍历和中序遍历建树,然后使用stl模板下的queue进行层序遍历即可。
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 35;
typedef struct Node{
int data;
Node *left, *right;
}Node;
int post[maxn], in[maxn], level[maxn];
Node* createTree(int postL, int postR, int inL, int inR);
void levelOrder(Node *root);
int main(int argc, char** argv) {
int N;
scanf("%d", &N);
for(int i = 0; i < N; i++){
scanf("%d", &post[i]);
}
for(int i = 0; i < N; i++){
scanf("%d", &in[i]);
}
Node* root = createTree(0, N - 1, 0, N - 1);
levelOrder(root);
for(int i = 0; i < N; i++){
if(i != 0) printf(" ");
printf("%d", level[i]);
}
return 0;
}
Node* createTree(int postL, int postR, int inL, int inR){
if(postL > postR){
return NULL;
}
Node *root = new Node;
root->data = post[postR];
int k;
for(k = inL; k <= inR; k++){
if(in[k] == root->data){
break;
}
}
int leftNum = k - inL;
root->left = createTree(postL, postL + leftNum - 1, inL, inL + leftNum - 1);
root->right = createTree(postL + leftNum, postR - 1, inL + leftNum + 1, inR);
return root;
}
void levelOrder(Node *root){
queue<Node*> q;
q.push(root);
int num = 0;
while(!q.empty()){
Node* now = q.front();
q.pop();
level[num++] = now->data;
if(now->left){
q.push(now->left);
}
if(now->right){
q.push(now->right);
}
}
}