【通过PAT复习C++与数据结构】PAT-A 1020 Tree Traversals (25 分)

题目

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值