PTA:根据后序和中序遍历输出先序遍历 (20 分)

题目详情:

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。

输入格式:

第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:

在一行中输出Preorder: 以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

结尾无空行

输出样例:

Preorder: 4 1 3 2 6 5 7

结尾无空行

作者:DS课程组;单位:浙江大学;代码长度限制:16 KB;时间限制:400 ms;内存限制:64 MB

已知中序和后序遍历,求前序遍历。如果是笔算,正常思路就是先从后序遍历倒着读,找到后序结果的最后一个(根),然后可以再中序中找到该节点,分为左右两个部分为左右子树,再重复上述操作。这是一个递归的过程,找到左右子树的时候就可以递归求解了。

我写的一个打印前序函数为:void print_front(int *l,int *m,int p=n-1)

l为后序数组,m为中序数组,p为根结点的位置

下面只要在中序中找到l[p]的位置,然后根据这个位置复制出左边的中序和后序数组L1[n],L2[n],以及右边的R1[n],R2[n].传入递归即可。在这个过程中要注意复制的位置。

Code:

#include
using namespace std;
int n;
int find(int *a,int x)  //再数组中找x(肯定可以找到)
{
	for(int i=0;i=0){
		cout<<" "<>n;
	int last[n],mid[n];
	for(int i=0;i>last[i]; //后序
	for(int i=0;i>mid[i]; //中序
	cout<<"Preorder:";
	print_front(last,mid); 
	return 0;
}

结果:

PTA:根据后序和中序遍历输出先序遍历 (20 分)_第1张图片

按照这个思路就AC了。我看到dalao用string的性质,直接取子串,就省去了繁琐的数组复制。当然是对于读入后序中序时就是字符串更适用,而本题读的是数。

不过我还是强行用string又写了一个:

#include
#include
using namespace std;
void print_front(string l,string m) //l为后序字串,m为中序
{
	if(l.size()>0){
		int ch=l[l.size()-1]; //找到最后一个
		cout<<" "<>n;
	string last,mid;
	for(int i=0;i>x;
		last.push_back(x); //不管字符是什么,输出只关心ascll码,string只是个工具
	}
	for(int i=0;i>x;
		mid.push_back(x);
	}
	cout<<"Preorder:";
	print_front(last,mid);
	return 0;
}

结果:

PTA:根据后序和中序遍历输出先序遍历 (20 分)_第2张图片 

注意:如果给的数据量比较大,不要用字符串处理,毕竟ascll值最大为255.

 

你可能感兴趣的:(浙大数据结构与算法pta题目,c++,数据结构,算法,二叉树,分治算法)