树的三种遍历方式的遍历顺序:
先序遍历:根、左子树、右子树(特点:第一个元素为根)
中序遍历:左子树、根、右子树(特点:根的两边分别为左子树和右子树)
后序遍历:左子树、右子树、根(特点:最后一个元素为根)
有如下图的二叉树:
其先序、中序、后序遍历分别为:DBACEGF、ABCDEFG、ACBFGED。
1、已知先序和中序求后序
先序遍历的第一个字符为根,因此只需在中序遍历中找到它,就可以把根节点的左子树和右子树分开,就可以知道左子树的字符个数和右子树的字符个数,然后可以确定先序遍历中哪部分是左子树,哪部分是右子树,之后递归先序遍历的序列,直到结束。
如上面的例子:先序遍历的第一个字符是D,则根节点为D,从中序遍历中可以找到D的位置,左边的ABC即为左子树的字符,右边的EFG即为右子树的字符,如果开始递归函数为:build(“DBACEGF”),则找到根的位置后,可以分为递归左子树的先序遍历和递归右子树的先序遍历:build(“BAC”)和build(“EFG”),其对应的中序遍历为:ABC和EFG。然后继续进行以上步骤,直到找完先序序列。每找到根就可以直接输出或保存到数组中,需要注意的是递归的时候不要把根包含在内。
代码如下(已知先序和中序求后序):

#include<stdio.h>
#include<cstring>
char a[30],b[30];
void fun(int r1, int l1, int r2, int l2)
{{//四个参数分别为:先序遍历的起始位置和结束位置和中序遍历的起始位置和结束位置int i;if(r1>l1))//如果已经到达叶子,返回return;for(i=r2;b[i]!=a[r1];++i);//找到根节点在中序遍历中的位置fun(r1+1, l1-l2+i,r2,i-1);//递归求左子树的后序遍历,r1+1是指把根去掉之后的位置fun(l1-l2+i+1,l1,i+1,l2);//递归求右子树的后序遍历putchar(a[r1]);//在递归结束后输出根
}
int main(void)
{int i;while(scanf("%s%s",a,b)!=EOF){int l=strlen(a);fun(0,l-1,0,l-1);puts("");}return 0;
}

2、已知中序和后序求先序
后序序列的特点是最后一个是根,道理与已知先序和中序求后序一样,同样是递归,只是需要改变几个参数。附上代码和注释。

#include<stdio.h>
#include<cstring>
char a[30],b[30];
void fun(int r1, int l1, int r2, int l2)
{int i;if(r1>l1)return;putchar(a[l1]);//由于是求先序遍历,所以要先输出根节点for(i=r2;b[i]!=a[l1];++i);//对应的,后序序列的最后一个为根,所以根为a[l1]fun(r1,l1-l2+i-1,r2,i-1);//递归求左子树的先序遍历fun(l1-l2+i,l1-1,i+1,l2);//递归求右子树的先序遍历,l1-1为去掉根后的位置
}
int main(void)
{int i;while(scanf("%s%s",a,b)!=EOF){//先输入后序,在输入中序int l=strlen(a);fun(0,l-1,0,l-1);puts("");}return 0;
}

二叉树:已知先序和中序求后序,已知中序和后序求先序相关推荐

  1. matlab 中序列求极值的方法,Matlab中求序列的极值

    我们知道,在Matlab中有专门求序列最大值和最小值的函数,分别是Max 和 Min,但是有时候我们不满足于求整个序列的最值,而是对序列的极值,也就是局部的最值感兴趣.对于解析函 数,这个比较简单,只 ...

  2. 用计算机求tan角度,三角函数计算器-已知三角函数值如何用计算器求角度?已知三角 – 手机爱问...

    2017-03-13 近视度数是怎么计算的? 透镜的折光能力,叫聚散度,又称屈光力,以屈光度为单位[diopter,D],通常用D表示.透镜的屈光力在数值上等于焦距[以米表示]除1. 当眼处于非调节状 ...

  3. mysql中如何求出学生人数,mysql中如何查询同时参加计算机考试和英语考试的学生人数...

    mysql中如何查询同时参加计算机考试和英语考试的学生人数 mysql中如何查询同时参加计算机考试和英语考试的学生人数 mysql中如何查询同时参加计算机考试和英语考试的学生人数 学生信息表 学生成绩 ...

  4. 已知二叉树先序和中序遍历结果,求后序遍历结果

    以下面的例题为例进行讲解:已知一棵二叉树的先序遍历序列和中序遍历序列分别是ABDCEF.BDAECF,求二叉树及后序遍历序列. 分析:先序遍历序列的第一个字符为根结点.对于中序遍历,根结点在中序遍历序 ...

  5. 已知二叉树:先序和中序求后序/后序和中序求先序

    P1030 [NOIP2001 普及组] 求先序排列 # [NOIP2001 普及组] 求先序排列 ## 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示, ...

  6. 已知中序、后序,求先序

    题目:[NOIP2001]求先序排列 参考题解:[NOIP2001]求先序排列题目题解 首先举例: 中序: FDBEG A CH 后序: FDGEB HC A 设递归函数名为void xian(str ...

  7. 二叉树排序--简单明了(知道前序后续求中序..)

    前序.中序.后序遍历的特性: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历: 1.后序遍历左子树 2 ...

  8. 给定二叉树先序、中序遍历序列,求后序遍历

    给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列. 输入描述: 输入为一行. 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔.保证数据合法 输出描述: 对应输 ...

  9. c语言编程实现二叉树的镜像,C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)...

    本文主要向大家介绍了C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. #include #include ...

最新文章

  1. OC 组合实现多继承
  2. 用于时序动作提名生成任务,爱奇艺提出BC-GNN图神经网络 | ECCV 2020
  3. R显卡VR性能如何?AMD发布 VRMark Cyan Room 测试结果
  4. Lintcode 1230解题思路和c++代码
  5. xmx java_为什么我的Java进程比Xmx消耗更多的内存?
  6. 虚拟机安装windows服务出现无法打开内核设备“\\.Global\vmx86”
  7. 一位Oracle顶流铁粉的“躬身入局”
  8. DAM的内涵正在改变
  9. python用什么软件编程-python用什么软件编写
  10. Javascript:ES6语法简述
  11. live2d_原画人插画教程,想知道live2d虚拟主播是怎么制作出来的吗?
  12. PS如何调整图片像素大小
  13. python 生物信息学_生物信息学算法之Python实现
  14. 服务器无线通信方案,无线数据传输模块组网及功能
  15. 百度ueditor编辑器控制图片在编辑框中的大小
  16. 解读—revealing deep semantic commercial patterns:Insights from urban landscape depiction
  17. 网站架构资料收集整理
  18. [NN]前向神经网络的tf.keras详细实现教学
  19. 虚拟机服务器磁盘扩容步骤,vmware ESXi 虚拟机扩容磁盘空间
  20. 创建数据库报错--MySQL server is running with the --super-read-only option

热门文章

  1. python 模拟微信浏览器请求_用chrome在电脑上模拟微信内置浏览器
  2. 第10课:主流的分布式消息队列方案解读及比较
  3. 抖音信号干扰特效怎么做?手把手教你AE制作
  4. 2022-2028年中国船舶工业行业投资潜力研究及发展趋势预测报告
  5. 机器学习Matplotlib的简单使用
  6. android的多渠道打包,Android美团多渠道打包Walle集成
  7. 图图图!在JMP中让你的数据动起来
  8. 请不要问LCD和LED屏哪个好了,因为这完全不是同一个概念!
  9. 盘点2011电子商务七宗“最”和行业十大动态
  10. c# leetcode1079. 活字印刷(回溯算法)