题目链接

https://www.luogu.org/problemnew/show/P1030

模板题

先讲一下二叉树的遍历

二叉树的遍历

  • 分类
  • 性质
  • 求法

分为三类:

  1. 先序遍历(PreOrder):根节点→左子树→右子树
  2. 中序遍历(InOrder):左子树→根节点→右子树
  3. 后序遍历(PostOrder):左子树→右子树→根节点

我们可知:

  • **序遍历实际上是指根节点的位置
  • 无论哪种遍历顺序,左子树都在右子树的前面
  • 在前序遍历中,第一个点是根节点
  • 在后序遍历中,最后一个点是根节点

例如这样一个二叉树:

它的先序遍历:A--B--D--E--X--C--F--Y--Z

它的中序遍历:D--B--X--E--A--Y--F--Z--C

它的后序遍历:D--X--E--B--Y--Z--F--C--A

求后序遍历

用到递归的思想,求整个二叉树的后序遍历就是求每个子树的后序遍历,最后连接起来即可。

 #include<iostream>
using namespace std;
string z,q;
int len,cnt;
void PostOrder(int l,int r){//求中序遍历中l到r这个子树的后序遍历
if(l>r) return; //边界条件
int i;
char ans=q[cnt++]; //先序遍历的第一个是根节点
for(i=l;i<=r;i++){
if(z[i]==ans) break;//找到根节点在中序遍历中的位置
}
PostOrder(l,i-); //递归左子树
PostOrder(i+,r); //递归右子树
cout<<ans; //注意后序遍历是左右根的顺序,所以最后输出根
}
int main()
{
cin>>z>>q; //z是中序遍历,q是先序遍历
len=z.length()-;
PostOrder(,z.length()-);//一开始是整个子树
return ;
}

求先序遍历

这比求后序遍历稍微有些复杂,需要保留根节点,即:PreOrder(左端点,右端点,根节点)。这是因为根节点在先序遍历中是从前往后排列的,而在后序遍历中不是这样的。

还是这个图:

它的先序遍历:A--B--D--E--X--C--F--Y--Z

它的中序遍历:D--B--X--E--A--Y--F--Z--C

它的后序遍历:D--X--E--B--Y--Z--F--C--A

在先序遍历中,根节点依次是A,B,D,E,X……是按照从前往后的顺序排列的,所以可以直接 ans=q[cnt++]; 而在后序遍历中却不是这样。

有人或许会说:那后序遍历中根节点是从后往前排列的,其实这是一个错误的结论。还是看这一个二叉树,后序遍历是A,C,F,Z,Y,B……显然是按照根→右子树→左子树排列的,而我们求的先序排列是根→左→右,显然这种方法不行。

所以我们需要多传一个参数,来记录根节点在后序遍历中的位置。重点:确定子树的根节点在后序遍历中的位置。

 #include<iostream>
using namespace std;
string z,h;
int len;
void PreOrder(int l,int r,int root){//求中序遍历中l到r这个子树(以root为根)的后序遍历
if(l>r) return;
int i;
for(i=l;i<=r;i++){ //和求后序遍历一样
if(z[i]==h[root]) break;
}
cout<<h[root]; //注意是根左右
PreOrder(l,i-,root-(r-i)-);//左子树的根节点就是原来根节点减去右子树的节点数的上一个(r-i就是右子树的节点数)
PreOrder(i+,r,root-); //右子树的根节点就是后序遍历中原来根节点的上一个
}
int main()
{
cin>>z>>h;
len=h.length()-;
PreOrder(,z.length()-,len);
return ;
}

而在知道先序遍历和后序遍历的情况下,中序遍历是不唯一的,但可以求出情况数(后面将做补充)。

//NOIP2001普及组t3

二叉树的遍历 &【NOIP2001普及组】& 洛谷 P1030 求先序排列的更多相关文章

  1. 洛谷 P1030 求先序排列 Label:None

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...

  2. 洛谷P1030求先序排列

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8. 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列. 输 ...

  3. 洛谷 P1030 求先序排列

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...

  4. 洛谷——P1030 求先序排列

    https://www.luogu.org/problem/show?pid=1030#sub 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度< ...

  5. 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树

    至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...

  6. P1030 求先序排列 /// 二叉树的遍历

    题目大意: 给一棵树的中序排列 后序排列,求这棵树的先序排列 https://www.luogu.org/problemnew/show/P1030 二叉树的四种遍历解说 几种遍历的递归实现 后序排列 ...

  7. P1030 求先序排列 P1305 新二叉树

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度\le 8≤8). 输入输出格式 输入格式: 22行,均为大写字母组成的字符串,表示一棵二叉树的中序与 ...

  8. [NOIP2001] 提高组 洛谷P1027 Car的旅行路线

    题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个 矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单 ...

  9. [NOIP2001] 提高组 洛谷P1026 统计单词个数

    题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保 证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的 ...

随机推荐

  1. 使用SQL Server保存Session状态,实现单点登录

    在做一些应用网站时,我们可能会碰到这样一种情况:整个项目是由多个网站组成的,而我们要实现用户从一个站点登录后,跳转到其他网站不需要重复登录,即实现单点登录.目前实现单点登录的技术也有好几种,这篇文章描 ...

  2. Go并发原理

    Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言:也正是Go语言的并发特性,吸引了全球无数的开发者. 并发(concurrency)和并行(parallellism) 并发(c ...

  3. PTA 估值一亿的AI核心代码

    题面 比赛时被模拟题打自闭了,本来以为是个比较麻烦的模拟,实际上只要会C++的regex不到40行就能把这个题过掉了(orz smz) regex是用来处理正则表达式,里面有个函数regex_repl ...

  4. 什么是FastCGI, PHP-FPM

    CGI,FastCGI都是一套接口标准:是编程语言(比如php,python; python里面也有wsgi)与web服务器(比如Nginx)的通信标准(比如你跟老外交流,那么FastCGI就相当于是 ...

  5. HBase 协处理器统计行数

    环境:cdh5.1.0 启用协处理器方法1. 启用协处理器 Aggregation(Enable Coprocessor Aggregation) 我们有两个方法:1.启动全局aggregation, ...

  6. java中静态方法和非静态方法调用的一点小困扰,已解决。

    public static void main(String[] args) { // TODO Auto-generated method stub SimpleGui1B gui=new Simp ...

  7. Luogu 3934 Nephren Ruq Insania

    和Ynoi2016 炸脖龙重题了. BZOJ 5394. 首先是扩展欧拉定理: 一开始傻掉了……递归的层数和区间长度无关……也就是说我们每一次直接暴力递归求解子问题一定不会超过$logP$层,因为当模 ...

  8. Postman工具---请求与响应

    参考:http://blog.csdn.net/water_0815/article/details/53311561

  9. 知识问答网站---邮件发送失败--debug

    发送邮件失败的原因:授权码过期 注意,邮箱设置的密码是授权码,并不是自己登录的时候用的账号密码.

  10. Makefile的使用

    Makefile 使用 一.实验说明 课程说明 在先前的课程中,我们已经学习了 gcc 和 gdb 的使用.本节课程中,我们将介绍 Makefile 的使用.Makefile带来的好处就是--&quo ...