题目链接:求先序排列
这道题讲白了,就是数的构造,然后遍历。
思路大致是这样:
我们先通过后序遍历,找到当前区间的根,然后在中序遍历中找到根对应的下标,然后就可以分出左右子树,建立当前根与左右子树根的关系,然后分为两段,重复该操作即可。
先序遍历也没有什么难的,先输出根,然后判断是否有左右子树,有的话递归输出,没有就算。
下面上代码:
#include<bits/stdc++.h>
using namespace std;
struct point{ //1
int p; //2
int lc;
int rc;
}poi[26]; //3
void build(int* mid,int* back,int ml,int mr,int bl,int br){
if(mr-ml<1){ //4
return;
}
int root=back[br]; //5
int index;
for(int i=ml;i<=mr;i++){
if(mid[i]==root){
index=i; //6
break;
}
}
if(index-1>=ml){ //7
poi[root].lc=back[index-1-ml+bl];
poi[back[index-1-ml+bl]].p=root;
build(mid,back,ml,index-1,bl,index-1-ml+bl);
}
if(mr>=index+1){
poi[root].rc=back[br-1];
poi[back[br-1]].p=root;
build(mid,back,index+1,mr,index-ml+bl,br-1);
}
}
void treeprint(int root){
printf("%c",root+'A'); //8
if(poi[root].lc!=-1){ //9
treeprint(poi[root].lc);
}
if(poi[root].rc!=-1){
treeprint(poi[root].rc);
}
}
int main(){
char mid[10],back[10];
int midn[10],backn[10];
char c;
scanf("%s",mid);
scanf("%c",&c);
scanf("%s",back);
for(int i=0;i<26;i++){ //10
poi[i].p=-1;
poi[i].lc=-1;
poi[i].rc=-1;
}
int i;
for(i=0;mid[i]!='\0';i++){ //11
midn[i]=mid[i]-'A';
}
for(i=0;back[i]!='\0';i++){
backn[i]=back[i]-'A';
}
int root=backn[i-1];
build(midn,backn,0,i-1,0,i-1);
treeprint(root);
return 0;
}
讲11点(怪多的哈):
1处:写一个节点结构体。
2处:这个记录父亲没什么用,放在这里仅仅是为了保持节点数据的完整性。
3处:题目没有明确说只用前八个字母,所以还是小心点好,防止被坑。
4处:如果区间长度小于等于1,也就不可能再有子树,那么返回。
5处:找到根。
6处:找到根在中序遍历中的坐标。
7处:判断中序遍历中,根的左右边是否有字符,如果有说明有子树。
8处:打印当前根。
9处:判断是否有子节点。
10处:结构体数据初始化,用于判断左右子树是否为空。
11处:转化成数字便于处理,输出时别忘了转化回去。
求先序排列(NOIP2001&NOIP水题测试(2017082301))的更多相关文章
-
NOIP水题测试(2017082301)
你们从题目也能看出来今天的题是很水的. 前几期答案还没出,效率有点低,谅解,谅解. 今天的答案应该会出的很快. 下面给题目: 时间限制:3小时 题目一:旅行家的预算 题目二:进制转换 题目三:乘积最大 ...
-
失踪的7(P1590&NOIP水题测试(2017082301))
题目链接:失踪的7 水题,不解释. #include<bits/stdc++.h> using namespace std; int main(){ int t; scanf(" ...
-
子数整数(P1151&NOIP水题测试(2017082301))
题目链接:子数整数 水题,不解释,自己看代码: #include<bits/stdc++.h> using namespace std; int main(){ int k; scanf( ...
-
进制转换(NOIP2000&NOIP水题测试(2017082301))
题目链接:进制转换 这题得明白其中的数学方法,明白后就不难了. 那么我们应该怎么计算呢? 其实也很简单. 我们依然采取辗转相除法. 但是,对于负的余数,我们需要进行一些处理. 我们怎么处理呢? 很简单 ...
-
乘积最大(NOIP2000&NOIP水题测试(2017082301))
题目链接:乘积最大 这道题显然是道区间dp. 难度不是很大. 思路也很清晰. 我们设计一个三维状态. ans[l][r][k] 这里表示在闭区间[l,r]上操作k次的最大值. 操作就是加乘号. 转移也 ...
-
NOIP水题测试(2017082401)
哈,水题测试又来了! 上次的水题简单吧! 答案是以单题形式发布的(旅行家的预算随后发布). 下面来看今天的题,还是水题. 时间限制:5小时 题目一:看上去就很水 题目二:比上面一题还水 题目三:数的划 ...
-
NOIP水题测试(2017082501)
日常水题测试又来了! 以后答案都以单题形式公布. 下面看今天的水题: 时间限制:5小时 题目一:无法形容的水 题目二:比上一题还水 题目三:一元三次方程求解 题目四:单词接龙 题目五:统计单词个数 题 ...
-
旅行家的预算(NOIP1999&水题测试2017082301)
题目链接:旅行家的预算 这题还可以,不算太水. 这题贪心即可. 我们采取如下动作: 如果在装满油的情况下能到达的范围内,没有加油站,则无解. 如果在装满油的情况下能到达的范围内,油价最低的加油站的油价 ...
-
题解 P1030 【求先序排列】
题解 P1030 [求先序排列] 旧题新解~ 今天做这个题,发现还是没有AC,于是滚回来用了一大堆数据结构A了这个题目,好像复杂度还挺高...... #include <iostream> ...
随机推荐
-
Swift微博编写感
首先Swift是苹果2014年力推的编程语言.可见发展趋势 在此提供
-
iOS开发中的错误整理,(百思项目,指示器位置)设置控件尺寸和点坐标,先设置尺寸,再设置点坐标
之前对控件的尺寸和点的坐标的设置从来都是想到什么写什么,从来没有关心过顺序.然后就有了这次的血的教训!!!!! 下面是错误的截图,先设置的中心点,然后设置的宽度.程序运行就这样了,点别的没有毛病!!! ...
-
《OpenGL着色语言》理解点记录二
别人提到“OpenGL的处理管线”时,意味着什么? 准确的讲,应该是“OpenGL图形处理管线”,“管线”带有特定的顺序,在OpenGL中就是Graphics Processing Pipeline. ...
-
Excel——使用VLOOKUP函数关联跨工作薄数据
实验环境 有两个工作簿,一个是<花名册>,另一个是<入离职表>,<花名册>上有所有员工的详细信息,包括员工的姓名.部门.出生日期等,<入离职表>上有离职 ...
-
让Emeditor支持markdown编辑博客
让Emeditor支持markdown编辑博客 1. 关于高亮显示 2.生成HTML文件并预览 用惯了Emeditor,最近又开始学习用markdown写博客,怎么让Emeditor支持markdow ...
-
(转)SQL Server基础之存储过程(清晰使用)
阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储过程 简单来说,存储过程就是一条或 ...
-
ubuntu命令安装
1.当make时,发现没有对应的命令: apt-get install build-essential 安装工具,可解决这个问题
-
《Linux及安全》课程实践二
编译生成新内核 一.实践原理 Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率很高,但可扩展 ...
-
Python新手入门英文词汇笔记(转)
一.交互式环境与print输出 1.print:打印/输出2.coding:编码3.syntax:语法4.error:错误5.invalid:无效6.identifier:名称/标识符7.charac ...
-
Docker 创建 mysql 容器
docker -v Docker version 18.06.1-ce, build e68fc7a 拉取 docker mysql 最新的镜像 docker pull mysql Using ...