天天看點

PAT甲級1020

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;
}      

繼續閱讀