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
AC代码:
//后序遍历和中序遍历序列能唯一确定一棵二叉树 #include<stdio.h> #include<queue> using namespace std; struct Node { Node *lchild; Node *rchild; int num; }; int loc; //存储节点个数 int str1[30],str2[30]; void levelOrder(Node *root) { //利用STL的队列进行层序遍历 queue<Node *> q; if(root) q.push(root); //根节点入队列 while(!q.empty()) { Node *t = q.front(); //取得队头元素 q.pop(); //弹出队头元素 if(loc!=1) printf("%d ",t->num); else printf("%d",t->num); //最后一个节点后不输出空格 loc--; if(t->lchild) { //若左孩字存在,则入队列 q.push(t->lchild); } if(t->rchild) { //若右孩字存在,则入队列 q.push(t->rchild); } } } Node *build(int s1, int e1, int s2, int e2) { Node *ret = new Node(); //申请一个新的节点 ret->lchild = ret->rchild = NULL; //初始化左右孩子为空 ret->num = str1[e1]; //将后序最后一个节点赋给当前节点 int rootldx; for(int i=s2; i<=e2; i++) { if(str2[i] == str1[e1]) { rootldx = i; //寻找当前根节点在中序序列中的位置 break; } } if(rootldx != s2) { //中序遍历:左-根-右,当根节点位于序列头时表明左孩子为空 ret->lchild = build(s1,s1 + (rootldx-s2) - 1,s2,rootldx-1); } if(rootldx != e2) { ret->rchild = build(s1 + (rootldx-s2),e1-1,rootldx+1,e2); } return ret; } int main() { //freopen("in.txt","r",stdin); int n; while(scanf("%d",&n) != EOF) { for(int j=0; j<n; j++) { scanf("%d ",&str1[j]); } for(int k=0; k<n; k++) { scanf("%d",&str2[k]); } loc = n; Node *root = build(0,n-1,0,n-1); levelOrder(root); printf("\n"); } return 0; }