洛谷 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 ...
随机推荐
- CLR via C#(15)--String,熟悉而又陌生
好久没写文章了,再拿起这本书,学习加分享,乐趣无穷啊.这两天看了写关于字符串的知识,从学写代码的时候开始,我们就基本天天跟String打交道,对它再熟悉不过了.但是仔细看看,还是有一种拨开云雾的感觉, ...
- CXF学习 (1)
Axis(Apache) -> Axis2(Apache) XFire - > CXF (XFire+Celtrix) (Apache) CXF并不仅仅是Webservice框架,更号称是 ...
- 【leetcode】Sqrt(x)
题目描述: Implement int sqrt(int x). Compute and return the square root of x. 实现开根号,并且返回整数值(这个很重要,不是整数的话 ...
- (四)WebRTC手记之本地音频采集
转自:http://www.cnblogs.com/fangkm/p/4374668.html 上一篇博文介绍了本地视频采集,这一篇就介绍下音频采集流程,也是先介绍WebRTC原生的音频采集,再介绍C ...
- apache https配置步骤
转自:http://www.cnblogs.com/best-jobs/p/3298258.html 1. 确认是否安装ssl模块 是否有mod_ssl.so文件 2. 生成证书和密钥 linux ...
- PMP 第十三章 项目干系人管理
1.识别干系人是干什么?早期就识别干系人的原因是什么?识别干系人的输入和工具有哪些?干系人分析的几种模型是哪些?干系人登记册的内容有哪些?bbs.mypm.net 2.干系人参与程度的分类是怎样的?干 ...
- Intent传递对象的两种方法(Serializable,Parcelable) (转)
今天讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcela ...
- iOS经典面试题(转)
iOS经典面试题 前言 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目30多个没有一个答案是对 ...
- HTML5头部标签备忘
DOCTYPE DOCTYPE(Document Type),该声明位于文档中最前面的位置,处于html 标签之前,此标签告知浏览器文档使用哪种HTML 或者XHTML 规范. 推荐使用HTML5 推 ...
- C语言基本点初探
1,对于int a=10++;此语句错误,为什么呢,对于i++来说,i是一个变量,是把i加1然后赋值给i,然而10不是一个变量所以无法执行加加的语法; 2,运算符的优先级: 赋值运算符<逻辑运算 ...
