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 (≤), 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
基本思路:
1、因为中序遍历和后序遍历可以唯一确定一棵二叉树,所以首先构造处这颗树,然后进行层序遍历即可
2、建立二叉树的时候要判断左右子树长度为0,并且要注意参数的值传递。具体如何做可参考代码。
#include<iostream> #include<sstream> #include<algorithm> #include<map> #include<cmath> #include<cstdio> #include<string.h> #include<queue> #include<vector> using namespace std; struct Node { int data; Node *lchild,*rchild; }; void CreateTree(int inOrder[],int iL,int iR, int postOrder[],int pI,int pR,Node *&root) { int temp=0; while(inOrder[temp]!=postOrder[pR]) temp++; int leftLength=temp-iL; int rightLength=iR-temp; if(root==nullptr) { root =new Node(); root->data=postOrder[pR]; } if(leftLength>0) CreateTree(inOrder,iL,temp-1,postOrder,pI,pR-rightLength-1,root->lchild); if(rightLength>0) CreateTree(inOrder,temp+1,iR,postOrder,pI+leftLength,pR-1,root->rchild); } int a[31]; void level(Node *root) { queue<Node*> q; q.push(root); int i=0; while(!q.empty()) { Node *temp=q.front(); q.pop(); a[i++]=temp->data; if(temp->lchild) q.push(temp->lchild); if(temp->rchild) q.push(temp->rchild); } } int main() { int n; cin>>n; int postOrder[n],inOrder[n]; for(int i=0; i<n; i++) cin>>postOrder[i]; for(int i=0; i<n; i++) cin>>inOrder[i]; Node *root=nullptr; CreateTree(inOrder,0,n-1,postOrder,0,n-1,root); level(root); if(n>0) cout<<a[0]; for(int i=1;i<n;i++) cout<<" "<<a[i]; return 0; }