题目
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
大意
给出二叉树的后序遍历和中序遍历,要求输出层序遍历。
解题思路
非常基本+经典的题型,考察了二叉树的还原和二叉树的层序遍历。
二叉树还原:根据中序遍历+先序遍历、后序遍历、层序遍历中的任何一个,都可以还原出唯一的二叉树。算法的基本原理就是根据中序遍历划分左右子树。
二叉树层序遍历:二叉树层序遍历是借助队列实现的,每次出队一个节点的时候做三件事{访问、将他左子树入队列、将他右子树如队列。
复杂度分析
层序遍历的时候复杂度是On,还原二叉树的复杂度是O(n²),综合起来是O(n²)
代码
#include<iostream>
#include<queue>
using namespace std;
const int maxn=50;
int postorder[maxn];
int inorder[maxn];
int N;
typedef struct node{
int data;
node* lchild;
node* rchild;
}node;
node* creat(int postl,int postr,int inl,int inr){
if(postl>postr)return NULL;
node* temp=new node;
temp->data =postorder[postr];
int k;
for(k=inl;k<=inr;++k){
if(inorder[k]==postorder[postr])break;
}
int numlefttree=k-inl;
temp->lchild=creat(postl,postl+numlefttree-1,inl,k-1);
temp->rchild=creat(postl+numlefttree,postr-1,k+1,inr);
return temp;
}
void leveltravel(node* temp){
queue<node*> q;
q.push(temp);
int num=0;
while(!q.empty()){
node* now=q.front();
cout<<q.front()->data;
num++;
if(num<N)cout<<" ";
q.pop();
if(now->lchild !=NULL)q.push(now->lchild );
if(now->rchild!=NULL)q.push(now->rchild );
delete now;
}
}
int main(){
cin>>N;
for(int i=0;i<N;++i){
cin>>postorder[i];
}
for(int i=0;i<N;++i){
cin>>inorder[i];
}
node* temp=new node;
temp=creat(0,N-1,0,N-1);
leveltravel(temp);
}
提交时间 状态 分数 题目 编译器 耗时 用户
2019/8/19 20:24:19
答案正确
25 1020 C++ (g++) 3 ms Chester
测试点 结果 耗时 内存
0 答案正确 2 ms 348 KB
1 答案正确 2 ms 384 KB
2 答案正确 2 ms 384 KB
3 答案正确 2 ms 384 KB
4 答案正确 2 ms 384 KB
5 答案正确 3 ms 384 KB