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
总结:
- 本代码中,根据中序和先序或后续来构造树需要熟记
- 层序遍历输出需要熟记
代码:
#include <stdio.h>
#include <queue>
//#include <string.h>
//#include <algorithm>
using namespace std;
struct node{
int data;
node* lchild;
node* rchild;
};
int Post[50],In[50];
node* Create(int postL,int postR,int inL,int inR){
if(postL>postR){ //设置循环边界
return NULL; //NULL必须大写
}
node* root = new node; //新建一个结点用来存放当前树的根结点
root->data = Post[postR]; //为根节点赋值
int k;
for(k=inL;k<=inR;k++) { //与中序序列比较,注意,确定一棵树——中序序列是必要的的,另外再加一个先序序列或者后序序列
if(root->data==In[k]){
break;
}
}
int numleft = k-inL; //左子树的个数
root->lchild=Create(postL,postL+numleft-1,inL,k-1); //递归构造树,最重要的部分
root->rchild=Create(postL+numleft,postR-1,k+1,inR);//注意后序序列的左子树需要减一,因为数组中编号从0开始
return root;
}
void LevelTraversals(node* root){
queue<node*> q; //主要注意一下队列中存储的是结构体
q.push(root); //将根结点加入
while(!q.empty()){
node* now=q.front();
q.pop();
printf("%d",now->data);
if(now->lchild!=NULL) q.push(now->lchild); //利用循环,进行
if(now->rchild!=NULL) q.push(now->rchild);
if(q.size()!=0) printf(" ");
}
}
int main(){
int total;
scanf("%d",&total);
for(int i=0;i<total;i++){
scanf("%d",&Post[i]);
}
for(int i=0;i<total;i++){
scanf("%d",&In[i]);
}
node* root=Create(0,total-1,0,total-1); //是下标而非数字
LevelTraversals(root);
return 0;
}