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
题目大意:
给出后序遍历和中序遍历,求输出层次遍历,不能有多余的空格
结题思路:
根据后序遍历和中序遍历构造二叉树,使用BFS进行层序遍历。
So?怎么根据后续遍历和中序遍历求出整个二叉树?
以本题为例,我们知道后序遍历就是最后输出父节点,那么后序遍历的最后一个数字一定是根节点,也就是4;
中序遍历是中间输出父节点,利用根节点是4,把中序遍历的结果分成两部分,左边部分是左子树,右部分是右子树。
计算左边节点的数量k,从后序遍历的结果中从头开始取k个节点重复上面过程。右部分同理
#include <stdio.h>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int maxnum=31;
int post[maxnum];
int in[maxnum];
int n,rt;
struct node{
int data;
node * lchild;
node * rchild;
}nodes[maxnum];
node* createTree(int postl,int postr,int inl,int inr){
if(postl>postr){
return NULL;
}
int k;
for(int i=inl;i<=inr;i++){
if(in[i]==post[postr]){
k=i;
break;
}
}
int numleft=k-inl;
node * now=new node;
now->data=post[postr];
now->lchild=createTree(postl,postl+numleft-1,inl,inl+numleft-1);
now->rchild=createTree(postl+numleft,postr-1,numleft+inl+1,inr);
return now;
}
int num=0;
void bfs(node * root){
queue<node *> q;
q.push(root);
while(!q.empty()){
node * now=new node;
now=q.front();
printf("%d",now->data);
num++;
if(n!=num){
printf(" ");
}
q.pop();
if(now->lchild!=NULL)q.push(now->lchild);
if(now->rchild!=NULL)q.push(now->rchild);
}
}
int main(){
int temp;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&temp);
post[i]=temp;
}
for(int j=0;j<n;j++){
scanf("%d",&temp);
in[j]=temp;
}
node *root=createTree(0,n-1,0,n-1);
bfs(root);
return 0;
}