PAT 甲级 1020 Tree Traversals (二叉树遍历)
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 7Sample Output:
4 1 6 3 5 7 2
根据后续遍历和中序遍历,求二叉树
#include <iostream> #include <string.h> #include <stdlib.h> #include <algorithm> #include <math.h> #include <stdio.h> #include <queue> using namespace std; typedef struct Tree { int data; Tree *lchild; Tree *rchild; }a[40]; int post[40]; int in[40]; int n; int ans[40]; void dfs(int l1,int r1,int l2,int r2,Tree* &root) { root=new Tree(); int i; for( i=l1;i<=r1;i++) if(in[i]==post[r2]) break; root->data=post[r2]; if(i==l1) root->lchild=NULL; else dfs(l1,i-1,l2,l2+i-l1-1,root->lchild); if(i==r1) root->rchild=NULL; else dfs(i+1,r1,r2-(r1-i),r2-1,root->rchild); } int cnt; void bfs(Tree *tree) { queue<Tree*> q; q.push(tree); while(!q.empty()) { Tree *root=q.front(); q.pop(); ans[cnt++]=root->data; if(root->lchild!=NULL) q.push(root->lchild); if(root->rchild!=NULL) q.push(root->rchild); } } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&post[i]); for(int i=1;i<=n;i++) scanf("%d",&in[i]); Tree *tree; dfs(1,n,1,n,tree); cnt=0; bfs(tree); for(int i=0;i<cnt;i++) { if(i==cnt-1) printf("%d\n",ans[i]); else printf("%d ",ans[i]); } } return 0; }