由二叉树前序序列、中序序列输出相应后续序列
题目描述:
给定一棵二叉树的前序遍历和中序遍历序列,求其后序遍历续列(注:给定中序遍历序列,只要知道前序、后序或者层次遍历中的一种就能唯一的确定一棵二叉树)。
输入:
两个字符串,其长度均小于26。
第一行为前序遍历,第二行为中序遍历。二叉树的结点名称以大写字母表示:A,B,C,D.......,最多26个字母。
输出:
输入样例可能有多组,对于每组测试样例,输出一行,为后续遍历的字符串。
样例输入:
ABC
BAC
FDXEAG
XDEFAG
样例输出:
BAC
XEDGAF
问题分析:
本题目涉及二叉树的建立、遍历、还原、删除等操作。给定二叉树的前序及中序就可以唯一的确定一棵二叉树,然后对二叉树
进行后续遍历一次,就可以得到所求的后序序列。遍历采用递归的遍历,以减少代码量,免得出错。
直接看代码吧:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<algorithm>using namespace std;typedef struct node //二叉树结点结构体
{struct node * lchlid;struct node * rchild;char data;
}Node;Node * Convert(char PS[],char IS[],int pl,int pr,int il,int ir)
{//由前序序列,中序序列构造二叉树的函数if (pl<=pr){Node * p=(Node *)malloc(sizeof(Node)); //分配内存,建立树结点p->data=PS[pl];int k =il;while(IS[k]!=PS[pl]) k++;p->lchlid = Convert(PS,IS,pl+1,pl+k-il,il,k-1); //递归建立左子树p->rchild = Convert(PS,IS,pl+k-il+1,pr,k+1,ir); //递归建立右子树return p;}else return NULL;
}void PostOrder(Node * p) //二叉树的后续遍历
{if (p!=NULL){PostOrder(p->lchlid);PostOrder(p->rchild);printf("%c",p->data);free(p); //销毁结点,释放内存}
}int main()
{char PostStr[26],InStr[26];while (scanf("%s%s",PostStr,InStr)!=EOF) //输入前序及后序中序序列{int len = strlen(PostStr);if (len!=strlen(InStr)){printf("错误:输入前序序列与中序序列不等长!");exit(0);}Node * T = Convert(PostStr,InStr,0,len-1,0,len-1); //建立一棵二叉树PostOrder(T); //遍历并输出二叉树的后序序列}return 0;
}
黑框框运行结果:
后记:
注意二叉树的结构体的定义方法,本代码使用C语言(C++稍有不同),在用malloc进行动态分配内存前要引用头文件
malloc.h,内存分配后也要在合适时候对内存进行回收。
参考了王道系列的《计算机考研——机试指南》。
由二叉树前序序列、中序序列输出相应后续序列相关推荐
- 二叉树——前序和中序得到后序
由二叉树的前序和中序如何得到二叉树的后序呢?要给出答案,首先得明白什么是前序.中序.后序. 二叉树前序:遍历顺序为,根节点.左子树.右子树:中序:遍历顺序为,左子树.根节点.右子树:后序:遍历顺序为, ...
- 二叉树前序、中序、后序遍历求法
二叉树前序.中序.后序遍历相互求法 二叉树的三种遍历方法: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序 ...
- 二叉树前序、中序、后序遍历相互求法
二叉树是数据结构中的重要知识点,最近准备笔试的时候总是会有以下问题:如果知道二叉树的两种遍历,如何求第三种遍历.本文将说明如何根据二叉树的两种遍历构建二叉树,进而求出第三种遍历方式,最后给出由前序.中 ...
- 二叉树前序,中序求后续;中序,后续求前序
一, 1,知道前序,中序,求后续 前序:ABCDEFGHI 中序:BCAEDGHFI 由图可知后序为:CBIHGFEDA 2.知道中序,后续求前序 中序:BDCEAFHG 后序:DECBHGFA 由后 ...
- 二叉树前序、中序、后序遍历及推导方法
目录 二叉树的遍历方法 推导遍历结果 1.已知前序遍历和中序遍历 2.已知中序遍历和后序遍历 3.已知前序遍历和后序遍历,无法确定一颗唯一的二叉树 参考文献 二叉树的遍历方法 前序遍历:根左右.先打印 ...
- Python 递归式实现二叉树前序、中序、后序遍历
记忆点: 前序:VLR 中序:LVR 后序:LRV 举例: 一颗二叉树如下图所示 则它的前序.中序.后序遍历流程如下图所示 前序遍历 class Solution:def preorderTraver ...
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
一.基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒. 性质: 1.非空二叉树的第n层上至多有2^(n-1)个元素. 2.深度为h的二叉树至多有2^h-1个结点. 满二叉树:所有终端都 ...
- 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现
二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...
- 二叉树前序、中序和后序遍历的非递归实现
1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...
最新文章
- UIEdgeInsets 说明
- android系统应用开发_利用ADB工具免root停用Android系统应用
- Allure Report使用
- 准备入门IC的全局观念系列-下
- Scala Akka网络编程:Client Server网络通信(你问我答)案例
- Linux——CentOS安装桌面
- Eclipse调试方法
- select ...as_一起使用.select .map和.reduce方法可充分利用Ruby
- windows nginx c++读取请求数据_轻松应对百万并发的Nginx,搞懂LinuxC/C++这些技术栈升职加薪...
- 吉大计算机学院刘淑芬,刘淑芬-吉林大学计算机科学与技术学院
- tftp下载文件为中文名【原创】
- oracle服务名连接慢,数据库 – Oracle SID和服务名称;连接问题
- RFM模型的理解和python案例分析
- jQuery-点击按钮页面滚动到顶部,底部,指定位置
- 如果你被领导当众打了一耳光,你会怎么做?
- linux上数据库导入与导出(mysql)
- 剪映专业版 1.0.3中文修复版(支持M1芯片、适配Big Sur)
- 【java】输出素数
- WPS Office 国际版 添加中文语言包 及相关问题
- The scripts f2py, f2py3 and f2py3.8 are installed in ‘/home/cyd/.local/bin‘ which is not on PATH
热门文章
- uniapp+微信小程序云函数获取微信openId
- 极客时间和极客学院_本周极客历史:旅行者指南,光盘和旋风式操作系统
- solidworks 文件服务器,solidworks配置服务器
- kubernetes证书配置相关
- qtabwidget设置表头_QTableWidget添加表头菜单 并 可以通过表头菜单隐藏选中列
- 关于 attiny 85 http://digistump.com/package_digistump_index.json下载错误
- python经纬度转换为平面坐标的算法_Python经纬度坐标转换为距离及角度的实现
- java有什么岗位_java开发有哪些岗位?相关岗位及工作职责
- 平方和误差函数--代价函数(机器学习)
- CC2530基础实验二 外部中断实验