题目描述:

二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

输入描述:

两个字符串,其长度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

二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列相关推荐

  1. 判断整数序列是不是二叉查找树的后序遍历结果

    转自:http://blog.csdn.net/tianshuai11/article/details/7068755 判断整数序列是不是二叉查找树的后序遍历结果 题目:输入一个整数数组,判断该数组是 ...

  2. 已知先序遍历和中序遍历,输出他的后序遍历序列.

    样例输入: DBACEGF  ABCDEFG 输出:ACBFGED BCAD CBAD 输出:CDAB 1 #include "stdafx.h" 2 #include<io ...

  3. 判断给定序列是否为BST后序遍历序列

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.假设输入的数组的任意两个数字都互不相同. 目录 一.BST 1.1 定义 1.2 性质 二.思路 2.1 非递归版本 2.2 递归版本 ...

  4. c语言输出字符串长度 空格,C++指针变量:输入一个字符串,删除字符串中所有空格,输出删除空格后字符串的长度,需编写以下功能函数...

    满意答案 a501866176 2015.04.28 采纳率:52%    等级:13 已帮助:6289人 1234567891011121314151617181920212223242526272 ...

  5. 如何使用非递归的方式后序遍历二叉树

    首先,后序遍历是按照左右根(LRN)的顺序遍历的.如果要求以递归的方式遍历二叉树,还是蛮简单的.只需要在树非空的情况下,依次递归调用传参(左子树),(右子树),再访问结点(或者是进行一些具体的操作,比 ...

  6. 二叉树的基本特性和二叉树的几种基本操作的机制_深入理解二叉树01 二叉树基础

    数据结构是所有的程序员就业过程中无法回避的知识,最近在回顾数据结构的内容,因此会不定期的推出一些数据结构的文章,分享自己的笔记. 树是数据结构中的重点,由于二叉树又是树中的重中之重.二叉树的应用也非常 ...

  7. 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...

  8. 二叉树 | 根据前序中序遍历重建二叉树

    Thinking 如果给你一颗二叉树的前序序列和中序序列,让你输出它的后序序列,你会怎么做呢? 也许很多同学能够很快的在纸上将一颗简单的二叉树画出来,但如果真正让你将自己的思路转换为算法,你会去怎样实 ...

  9. 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)

    引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...

最新文章

  1. python如何控制程序的运行顺序_Python流程控制-1 顺序执行
  2. 读书笔记 | 墨菲定律
  3. 【SignalR学习系列】4. SignalR广播程序
  4. C语言-转义字符注意事项
  5. 实验二+018+李滨
  6. python @property的介绍与使用
  7. 南阳理工ACM——106背包问题
  8. 用WPS2000做电子相册三步曲(转)
  9. 为猿七年有余,痒否?痛否?
  10. 步进电机结构C语言程序,51单片机驱动步进电机(含电路图和C语言源程序代码)
  11. java与nodejs使用SHA加密获得结果不同解决方法
  12. 保护眼睛缓解疲劳的方法(常用电脑的朋友)
  13. YY频道美化,模板修改工具【免费】可以闪动
  14. Unity做360度的全景照片
  15. 情人节程序员用HTML网页表白【超具创意的网页生日快乐】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  16. 主数据管理(MDM)项目建设落地方案
  17. Linux设备驱动——第三章字符驱动
  18. Hexo+Kaze+Gitee Pages 搭建静态博客网站
  19. 如何进行区块链的开发?
  20. 年薪超过 50 万的程序员在哪些公司工作?

热门文章

  1. Spring Cloud Feign使用详解
  2. Spring Boot 之异步执行方法
  3. mysql一次运行多个SQL文件
  4. webstorm使用插件 statistic 统计代码
  5. 如何才能通过设置将excel单元格内的14位数字转换为日期格式
  6. Android开发笔记(一百)折叠式列表
  7. 27.将 VMware 服务器上的虚拟机备份到 Azure(上)
  8. [CodeForces - 950D]A Leapfrog in the Array(思维)
  9. 代理设置。 安卓工作室配置用http代理。gradle可能需要这些http代理设置去访问互联网。例如下载依赖。 你想要复制ide的代理配置到这个项目的gradle属性文件吗?...
  10. jquery 让div滚动条自动滚动到最下面