二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列
题目描述:
二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
输入描述:
两个字符串,其长度n均小于等于26。 第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。
输出描述:
可能有多组样例,对于每组样例输出一行为后序遍历的字符串。
exp:
input output
ABC BCA
BAC
FDXEAG XEDGAF
XDEFAG
解题思路:
二叉树通过先序遍历和中序遍历以推出后序遍历序列
首先把输入的中序遍历和先序遍历存在两个字符串中
通过递归方法建立二叉树。
如:
前序:FDXEAG
中序:XDEFAG
记前序首位为l1,末位为r1
记中序首位为l2,末位为r2
分析:
前序遍历的第一个结点必然是二叉树的根结点(也可以是部分分支的根部节点,每一次调用建树函数可以唯一确定一个根部节点)
在中序遍历中找到这一节点位置记为i
记中序遍历首位开始到i的前一位【字符串长度】为len1=i-l2
记i后一位到中序遍历末位【字符串长度】为len2=r2-i
判断:如果len1>0 即有左子树情况 则对左子树部分递归调用建树函数(右子树同理)
如上例输入中,F为前序的第一个节点,此时在中序遍历中寻找F,在第4位,从而XDE为F的左子树的中序遍历,AG为F的右子树的中序遍历
XDE长度为3,即F后面连续的3位为F左子树的前序遍历,前序遍历序列倒数2位为F右子树的前序遍历
每次调用递归函数时,将上一次调用函数分出来的左右子树视为一个新的二叉树,按规则继续建树
建立完一棵树后再后序遍历输出结果即可。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 typedef struct BNode 5 { 6 char data; 7 struct BNode *lchild,*rchild; 8 } BNode,*btree; 9 btree buildtree(char preod[],int l1,int r1,char inod[],int l2,int r2) 10 { 11 BNode *t; 12 int i; 13 t=(BNode *)malloc(sizeof(BNode)); 14 t->data=preod[l1]; 15 for(i=l2; inod[i]!=t->data; i++); //寻找根在中序遍历的位置 16 int len1=i-l2,len2=r2-i; 17 if(len1>0)//如果有左子树 18 t->lchild=buildtree(preod,l1+1,l1+len1,inod,l2,l2+len1-1); 19 else t->lchild=NULL; 20 if(len2>0) 21 t->rchild=buildtree(preod,r1-len2+1,r1,inod,r2-len2+1,r2); 22 else t->rchild=NULL; 23 return t; 24 } 25 void postorder(btree t) 26 { 27 if(t->lchild) postorder(t->lchild); 28 if(t->rchild) postorder(t->rchild); 29 printf("%c",t->data); 30 return; 31 } 32 int main() 33 { 34 BNode *t; 35 int i=0; 36 char str1[30],str2[30]; 37 while(scanf("%s",str1)!=EOF) 38 { 39 scanf("%s",str2); 40 int l1=strlen(str1); 41 int l2=strlen(str2); 42 t=buildtree(str1,0,l1-1,str2,0,l2-1); 43 postorder(t); 44 printf("\n"); 45 } 46 return 0; 47 }
转载于:https://www.cnblogs.com/AKsnoopy/p/8395922.html
二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列相关推荐
- 判断整数序列是不是二叉查找树的后序遍历结果
转自:http://blog.csdn.net/tianshuai11/article/details/7068755 判断整数序列是不是二叉查找树的后序遍历结果 题目:输入一个整数数组,判断该数组是 ...
- 已知先序遍历和中序遍历,输出他的后序遍历序列.
样例输入: DBACEGF ABCDEFG 输出:ACBFGED BCAD CBAD 输出:CDAB 1 #include "stdafx.h" 2 #include<io ...
- 判断给定序列是否为BST后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.假设输入的数组的任意两个数字都互不相同. 目录 一.BST 1.1 定义 1.2 性质 二.思路 2.1 非递归版本 2.2 递归版本 ...
- c语言输出字符串长度 空格,C++指针变量:输入一个字符串,删除字符串中所有空格,输出删除空格后字符串的长度,需编写以下功能函数...
满意答案 a501866176 2015.04.28 采纳率:52% 等级:13 已帮助:6289人 1234567891011121314151617181920212223242526272 ...
- 如何使用非递归的方式后序遍历二叉树
首先,后序遍历是按照左右根(LRN)的顺序遍历的.如果要求以递归的方式遍历二叉树,还是蛮简单的.只需要在树非空的情况下,依次递归调用传参(左子树),(右子树),再访问结点(或者是进行一些具体的操作,比 ...
- 二叉树的基本特性和二叉树的几种基本操作的机制_深入理解二叉树01 二叉树基础
数据结构是所有的程序员就业过程中无法回避的知识,最近在回顾数据结构的内容,因此会不定期的推出一些数据结构的文章,分享自己的笔记. 树是数据结构中的重点,由于二叉树又是树中的重中之重.二叉树的应用也非常 ...
- 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...
- 二叉树 | 根据前序中序遍历重建二叉树
Thinking 如果给你一颗二叉树的前序序列和中序序列,让你输出它的后序序列,你会怎么做呢? 也许很多同学能够很快的在纸上将一颗简单的二叉树画出来,但如果真正让你将自己的思路转换为算法,你会去怎样实 ...
- 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)
引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...
最新文章
- python如何控制程序的运行顺序_Python流程控制-1 顺序执行
- 读书笔记 | 墨菲定律
- 【SignalR学习系列】4. SignalR广播程序
- C语言-转义字符注意事项
- 实验二+018+李滨
- python @property的介绍与使用
- 南阳理工ACM——106背包问题
- 用WPS2000做电子相册三步曲(转)
- 为猿七年有余,痒否?痛否?
- 步进电机结构C语言程序,51单片机驱动步进电机(含电路图和C语言源程序代码)
- java与nodejs使用SHA加密获得结果不同解决方法
- 保护眼睛缓解疲劳的方法(常用电脑的朋友)
- YY频道美化,模板修改工具【免费】可以闪动
- Unity做360度的全景照片
- 情人节程序员用HTML网页表白【超具创意的网页生日快乐】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- 主数据管理(MDM)项目建设落地方案
- Linux设备驱动——第三章字符驱动
- Hexo+Kaze+Gitee Pages 搭建静态博客网站
- 如何进行区块链的开发?
- 年薪超过 50 万的程序员在哪些公司工作?
热门文章
- Spring Cloud Feign使用详解
- Spring Boot 之异步执行方法
- mysql一次运行多个SQL文件
- webstorm使用插件 statistic 统计代码
- 如何才能通过设置将excel单元格内的14位数字转换为日期格式
- Android开发笔记(一百)折叠式列表
- 27.将 VMware 服务器上的虚拟机备份到 Azure(上)
- [CodeForces - 950D]A Leapfrog in the Array(思维)
- 代理设置。 安卓工作室配置用http代理。gradle可能需要这些http代理设置去访问互联网。例如下载依赖。 你想要复制ide的代理配置到这个项目的gradle属性文件吗?...
- jquery 让div滚动条自动滚动到最下面