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<cstdio>
#include<vector>
#include<queue>
using namespace std;

struct TreeNode
{
int data;
TreeNode *lchild, *rchild;
};
TreeNode* createTreeByPostAndIn(int* P,int postS, int postE, int* I,int inS, int inE)
{
if (postS > postE || inS > inE) return NULL;
int rootindex;
for (int k = inE; k >= inS; k--)
{
if (I[k] == P[postE])
{
rootindex = k;
break;
}
}
int numLeft = rootindex-inS;//中序中左子树节点个数
TreeNode* root = new TreeNode;
root->data = P[postE];
root->lchild = createTreeByPostAndIn(P, postS, postS + numLeft - 1, I, inS, inS + numLeft - 1);
root->rchild = createTreeByPostAndIn(P, postS+numLeft,postE-1, I, rootindex+1, inE);//注意求下标是求全局中的下标
return root;
}
void levelorder(TreeNode*root)
{
queue<TreeNode*> Q;
if (root)
{
Q.push(root);
}
bool flag = false;
while (!Q.empty())
{
TreeNode* tn = Q.front();
if (!flag)
{
printf("%d", tn->data);
flag = true;
}
else
printf(" %d", tn->data);
Q.pop();
if (tn->lchild) Q.push(tn->lchild);
if (tn->rchild) Q.push(tn->rchild);
}
}
int main()
{
int N;
scanf("%d", &N);
int *postorder = new int[N];
int *inorder = new int[N];
int temp;
for (int i = 0; i < N; i++)
{
scanf("%d", &postorder[i]);
}
for (int i = 0; i < N; i++)
{
scanf("%d", &inorder[i]);
}
TreeNode*ROOT = createTreeByPostAndIn(postorder, 0, N - 1, inorder, 0, N - 1);
levelorder(ROOT);
return 0;
}