洛谷 P1030 求先序排列 Label:None
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入输出格式
输入格式:
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式:
1行,表示一棵二叉树的先序。
输入输出样例
BADC
BDCA
ABCD
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
char mid[],aft[];
int N;
void dfs(int ml,int mr,int al,int ar){
if(ml > mr || al > ar) return; printf("%c",aft[ar]);
for(int k=ml;k<=mr;k++){
if(mid[k]==aft[ar]){
dfs(ml,k-,al,al+k-ml-);
dfs(k+,mr,al+k-ml,ar-);
break;
}
}
} int main(){
// freopen("01.in","r",stdin);
scanf("%s%s",mid,aft);
N=strlen(aft)-;
dfs(,N,,N);
return ;
}转个题解
我们有中序排列(左-中-右)和后序排列(左-右-中),求的是前序排列(中-左-右)。
首先要知道的是,有前序(后序)和中序可以求后序(前序),但是只有前序和后序是不能求得中序的,证明从略。
后序遍历的特征是什么呢?根节点总是在最后被访问到。
那中序遍历的特征又是什么呢?根节点的左右两侧的点恰是它的左右子树。
我们拿一棵树来举例子:
首先这棵树的根是A(后序排列的最后一个),输出A;
然后在中序排列中找到A的位置,发现它左右各有三个点,分别是它的左右子树;
把中序排列左边三个点和后序排列的前三个点作为左子树去dfs,因为先序排列是中-左-右,所以先走左边;
> [L]传入的中序是DEB,后序是EDB - 输出B,DE是左子树,同样操作;
>> [L]传入的中序是DE,后序是ED - 输出D,E是右子树,同样操作;
>>> [R]传入的中序是E,后序是E - 输出E;
> [R]传入的中序是FCG,后序是FGC - 输出C,F是左子树,同样操作,G是右子树,同样操作;
>> [L] 传入的中序是F,后序是F - 输出F;
>> [R] 传入的中序是G,后序是G - 输出G;
这样我们就完成了求先序遍历的过程。(上面略去了L/R子树为空的场合。
然后接下来我们就可以很简单地通过DFS来完成这道题了,因为求的是先序遍历,所以每次直接输出后序排列的最后一个点即可。没有必要去保存它。
在程序中我没有判断它有没有子树而是直接dfs了下去(为图方便)。因此,在dfs函数的开始要判断传入的字符串是否大于0。
另外,之前有人用了子串,但也没有必要,因为只访问而不修改,只要传给函数两个串的开始和结束下标就可以了。
代码如下,写起来很简单。
可以自己思考一下dfs中传入的四个参数为什么是那样。
洛谷 P1030 求先序排列 Label:None的更多相关文章
- 二叉树的遍历 &【NOIP2001普及组】& 洛谷 P1030 求先序排列
题目链接 https://www.luogu.org/problemnew/show/P1030 模板题 先讲一下二叉树的遍历 二叉树的遍历 分类 性质 求法 分为三类: 先序遍历(PreOrder) ...
- 洛谷P1030求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8. 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输 ...
- 洛谷 P1030 求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...
- 洛谷——P1030 求先序排列
https://www.luogu.org/problem/show?pid=1030#sub 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度< ...
- 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树
至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...
- P1030 求先序排列 /// 二叉树的遍历
题目大意: 给一棵树的中序排列 后序排列,求这棵树的先序排列 https://www.luogu.org/problemnew/show/P1030 二叉树的四种遍历解说 几种遍历的递归实现 后序排列 ...
- P1030 求先序排列 P1305 新二叉树
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度\le 8≤8). 输入输出格式 输入格式: 22行,均为大写字母组成的字符串,表示一棵二叉树的中序与 ...
- P1030 求先序排列
题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...
- P1030 求先序排列 (一个非常棒的写法)
理论正确就是真正的正确,误... 就是找嘛,找到每一个对应字符,然后对应的左右子树的区间,然后就可以了. #include <bits/stdc++.h> using namespace ...
随机推荐
- 二叉树学习笔记之B树、B+树、B*树
动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...
- gitlab安装部署
参考文章: https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/install/centos http://www.xsjxmx.com/ ...
- ZooKeeper 的羊群效应
一个需要避免的问题是当一个特定的znode 改变的时候ZooKeper 触发了所有watches 的事件. 举个例子,如果有1000个客户端watch 一个znode的exists调用,当这个节点被创 ...
- wp8 入门到精通 ImageCompress 图片压缩
//实例化选择器 PhotoChooserTask photoChooserTask = new PhotoChooserTask(); BitmapImage bimg; int newPixelW ...
- 实现一种快速查找Richedit中可见区域内OLE对象的方法
Richedit是一个OLE容器,使用Richedit来显示IM聊天内容时,通常使用OLE对象来实现在Richedit中播放表情动画. 触发表情的绘制有两种途径: 1.来自Richedit的刷新消息. ...
- 搭建Mantis 缺陷管理系统(转)
转自 什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list). It is written i ...
- Flash Media Server 4.0 破解 注册
Adobe Flash Media Interactive Server 3.5s/n:1373-5047-2985-0514-5175-0098 s/n: 1373-5632-4666-9521-8 ...
- java线程之——sleep()与wait()的区别
sleep()是Thread的方法,wait()是Object的方法 如果线程进入了同步锁,sleep不会释放对象锁,wait会释放对象锁 sleep的作用就是让正在执行的线程主动让出CPU,给其它线 ...
- 使用postMesssage()实现跨域iframe页面间的信息传递----转载
由于web同源策略的限制,当页面使用跨域iframe链接时,主页面与子页面是无法交互的,这对页面间的信息传递造成了不小的麻烦,经过一系列的尝试,最后我发现有以下方法可以实现: 1. 子页面url传参 ...
- 静态局部变量、静态全局变量、extern全局变量、自动变量 札记
静态局部变量 静态局部变量. 从称呼上我们可以看出,静态局部变量首先是一个局部变量,因此其只在定义它的函数内有效,冠以静态的头衔后,其生存期就被延长了,不会随着函数的返回而被撤销.我们可以这样来理解: ...
