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
题目大意是告诉一棵二叉树的后序遍历结果和中序遍历结果,求该二叉树的层序遍历。
解题思路分为两步:1.根据中序和后序,构造二叉树 2.输出二叉树层序遍历结果
根据二叉树的中序遍历和后序遍历,构造二叉树,可以采用递归的思想:后序遍历,最后一个节点为root,在中序遍历中找到该节点,则该节点前部分为它的左子树,后部分为它的右子树,进而也就得到该节点左子树的中序和后序,右子树的中序和后序,然后再用同样的方法可以求得左子树的root节点,右子树的root节点,递归之,构造出完整的二叉树。
二叉树层序遍历,可以利用队列:1.将根节点push进队列 2.出队,打印 3.将出队节点的左孩子和右孩子依次push进队列 4.重复2、3工作至队列为空
具体实现代码如下:
#include<cstdio> #include<algorithm> #include<string.h> #include<queue> using namespace std; typedef struct Node{ Node * left; Node * right; int value; }Node; int poster[35]; int inorder[35]; void creatree(int ph,int pe,int ih,int ie,Node * & node){ int i,j; if(node == NULL) node = new Node(); if(ph > pe || ih > ie) return; node->left = NULL; node->right = NULL; node->value = poster[pe]; for(i = ph,j = ih;i <= pe && j <= ie;i++,j++) if(inorder[j] == poster[pe]) break; creatree(ph,i - 1,ih,j - 1,node->left); creatree(i,pe - 1,j + 1,ie,node->right); } queue<Node *> Queue; int main(void){ int N; Node * root = NULL; scanf("%d",&N); for(int i = 0;i < N;i ++) scanf("%d",&poster[i]); for(int j = 0;j < N;j ++) scanf("%d",&inorder[j]); creatree(0,N-1,0,N-1,root); Queue.push(root); while(Queue.size()){ if(Queue.front()->value){ printf("%d",Queue.front()->value); N--; if(N) printf(" "); } if(Queue.front()->left) Queue.push(Queue.front()->left); if(Queue.front()->right) Queue.push(Queue.front()->right); Queue.pop(); } return 0; }