P1030
题面
给出一棵二叉树的中序排列与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。
输入格式
2行,均为大写字母组成的字符串,表示一棵二叉树的中序排列与后序排列。
输出格式
1行,表示一棵二叉树的先序排列。
样例
输入
BADC
BDCA
输出
ABCD
前置知识
先序遍历
若二叉树为空,则空操作,否则:
访问根结点、先序遍历左子树、先序遍历右子树

先序遍历此图结果为:124753689
中序遍历
若二叉树为空,则空操作,否则:
中序遍历左子树、访问根结点、中序遍历右子树
中序遍历上图结果为:742513869
后序遍历
若二叉树为空,则空操作,否则:
后序遍历左子树、后序遍历右子树、访问根结点
后序遍历上图结果为:745289631
思路分析
我们可以发现,一棵树后序排列的最后一位就是这棵树树的根节点。以样例为例,后序排列BDCA中最后一位为A,因此这棵树的根节点为A。
我们又可以发现,在一棵树的中序排列中,这棵树的根节点将它的中序排列分为两部分,即此根节点的左子树和它的右子树。同样以样例为例,中序排列BADC被根节点分为两部分,即B和DC两棵子树。
那么,我们只需要继续以同样的方法,递归寻找两棵子树的左子树和右子树就可以了。
代码实现中的难点
如何快速确定根节点在中序排列中的位置?
关于这一点我们当然可以一个一个地找过去,但为了让程序跑得更快,我们可以模仿映射的思想,建立一个数组,记录后序排列中的每一位在中序排列中的位置(具体实现看代码)
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
char mid[10],post[10];
//mid数组记录中序排列,post数组记录后序排列
//除了打暴力最好不要用string
int z[10],m[10],p[10];
//z数组做中转使用,m数组记录mid数组的内容,p数组记录post数组的每一位在mid数组中的位置
void find(int start,int end,int kai,int jie){
//start和end记录我们正在找的mid数组的范围
//kai(开头)和jie(结尾)记录我们正在找的post数组的范围
if(start>end||kai>jie)return;
//如果开头大于结尾,就返回
if(start==end||kai==jie){
printf("%c",mid[p[jie]]);
return;
}
//如果开头等于结尾,那此节点一定没有儿子,输出当前节点并返回
printf("%c",mid[p[jie]]);
//前面说过后序排列的最后一位就是当前树的根节点,所以p[jie]就是根节点在mid数组中的位置
//开头小于结尾,那就输出当前节点然后再去寻找此节点的左儿子和右儿子
find(start,p[jie]-1,kai,kai+p[jie]-start-1);
//求左子树的范围,然后递归寻找左儿子
find(p[jie]+1,end,kai+p[jie]-start,jie-1);
//求右子树的范围,然后递归寻找右儿子
}
int main(){
scanf("%s%s",mid+1,post+1);
//输入时下标从1开始(主要是因为我比较毛病)
int len=strlen(mid+1);
//输入时下标从1开始那么计算字符串长度时也要加1
for(int i=1;i<=len;i++){
m[i]=mid[i]-'A'+1;
//将每一位转成数字以方便处理(是的,我很毛病)
z[m[i]]=i;
//z数组记录m数组每一位的位置(这一步是为了方便后面记录post数字)
}
for(int i=1;i<=len;i++){
p[i]=z[post[i]-'A'+1];
//记录post数组的每一位在mid数组中的位置
//z:我滴任务完成啦!
}
find(1,len,1,len);
//开始递归
return 0;
}
如此就完成啦~
P1030的更多相关文章
- 题解 P1030 【求先序排列】
题解 P1030 [求先序排列] 旧题新解~ 今天做这个题,发现还是没有AC,于是滚回来用了一大堆数据结构A了这个题目,好像复杂度还挺高...... #include <iostream> ...
- 二叉树的遍历 &【NOIP2001普及组】& 洛谷 P1030 求先序排列
题目链接 https://www.luogu.org/problemnew/show/P1030 模板题 先讲一下二叉树的遍历 二叉树的遍历 分类 性质 求法 分为三类: 先序遍历(PreOrder) ...
- P1030 求先序排列 /// 二叉树的遍历
题目大意: 给一棵树的中序排列 后序排列,求这棵树的先序排列 https://www.luogu.org/problemnew/show/P1030 二叉树的四种遍历解说 几种遍历的递归实现 后序排列 ...
- 洛谷 P1030 求先序排列 Label:None
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...
- TYVJ P1030 乳草的入侵 Label:跳马问题
背景 USACO OCT09 6TH 描述 Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份佔领了一 ...
- [TYVJ] P1030 乳草的入侵
乳草的入侵 背景 Background USACO OCT09 6TH 描述 Description Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物 ...
- P1030 求先序排列 P1305 新二叉树
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度\le 8≤8). 输入输出格式 输入格式: 22行,均为大写字母组成的字符串,表示一棵二叉树的中序与 ...
- 洛谷P1030求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8. 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输 ...
- 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树
至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...
- P1030 求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...
随机推荐
- 016 Linux 卧槽,看懂进程信息也不难嘛?top、ps
目录 1 扒开看看 top 命令参数详情 第一行,[top - ]任务队列信息 第二行,[Tasks] 任务(进程) 第三行,[Cpu(s)]状态信息 第四行,[Mem]内存状态 第五行,[Swap] ...
- 6.Flink实时项目之业务数据分流
在上一篇文章中,我们已经获取到了业务数据的输出流,分别是dim层维度数据的输出流,及dwd层事实数据的输出流,接下来我们要做的就是把这些输出流分别再流向对应的数据介质中,dim层流向hbase中,dw ...
- RocketMQ的invokeSync call timeout异常的解决办法
缘起 在RocketMQ客户端的DefaultMQPushConsumer的start方法被执行时,时不时会报出invokeSync call timeout异常,如下: Caused by: jav ...
- 轻量级DI框架Guice使用详解
背景 在日常写一些小工具或者小项目的时候,有依赖管理和依赖注入的需求,但是Spring(Boot)体系作为DI框架过于重量级,于是需要调研一款微型的DI框架.Guice是Google出品的一款轻量级的 ...
- 如何深入学习Java并发编程?
在讲解深入学习Java并发编程的方法之前,先分析如下若干错误的观点和学习方法. 错误观点1:学习Java编程主要是学习多线程. 这话其实是说明了表面现象,多线程其实还真是并发编程的实现方式,但在实际高 ...
- 在 WPF 客户端实现 AOP 和接口缓存
随着业务越来越复杂,最近决定把一些频繁查询但是数据不会怎么变更的接口做一下缓存,这种功能一般用 AOP 就能实现了,找了一下客户端又没现成的直接可以用,嗐,就只能自己开发了. 代理模式和AOP 理解代 ...
- Tableau“出走中国”,“卖”给阿里,中国BI用户该何去何从?
11月,Tableau在发给客户的邮件中透露将停止中国的直销业务,加入阿里的合作体系.消息来的如此突然,Tableau的同仁.合作伙伴.客户.用户.爱好者,甚至友商,无一不感到震惊和担忧. 在我们数据 ...
- MySQL函数及存储过程
MySQL函数及存储过程 参考文章:https://www.cnblogs.com/wupeiqi/articles/5713323.html 1.函数 1.1内置函数 官方文档:https://de ...
- vue electron 运行时报错Cannot find module 'fs/promises'的解决方法
项目已经上线半年了,全省多地使用,突然出现的问题,最后发现是因为使用的 electron-updater 因为版本号没有锁定,突然之间就报了上面的错误,不管我怎么升级node都没用(哈哈,node本身 ...
- LOTO示波器汽修专用款选型指南
LOTO示波器汽修专用款选型指南 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测.汽修应用中,工程师对示波器的性能要求对于LOTO产品来说不算高. 在我们销售和技术支持的积累过程中,我 ...