题目描述:

给定一棵二叉树的前序遍历和中序遍历序列,求其后序遍历续列(注:给定中序遍历序列,只要知道前序、后序或者层次遍历中的一种就能唯一的确定一棵二叉树)。

输入:

两个字符串,其长度均小于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. 二叉树前序、中序、后序遍历求法

    二叉树前序.中序.后序遍历相互求法 二叉树的三种遍历方法: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序 ...

  3. 二叉树前序、中序、后序遍历相互求法

    二叉树是数据结构中的重要知识点,最近准备笔试的时候总是会有以下问题:如果知道二叉树的两种遍历,如何求第三种遍历.本文将说明如何根据二叉树的两种遍历构建二叉树,进而求出第三种遍历方式,最后给出由前序.中 ...

  4. 二叉树前序,中序求后续;中序,后续求前序

    一, 1,知道前序,中序,求后续 前序:ABCDEFGHI 中序:BCAEDGHFI 由图可知后序为:CBIHGFEDA 2.知道中序,后续求前序 中序:BDCEAFHG 后序:DECBHGFA 由后 ...

  5. 二叉树前序、中序、后序遍历及推导方法

    目录 二叉树的遍历方法 推导遍历结果 1.已知前序遍历和中序遍历 2.已知中序遍历和后序遍历 3.已知前序遍历和后序遍历,无法确定一颗唯一的二叉树 参考文献 二叉树的遍历方法 前序遍历:根左右.先打印 ...

  6. Python 递归式实现二叉树前序、中序、后序遍历

    记忆点: 前序:VLR 中序:LVR 后序:LRV 举例: 一颗二叉树如下图所示 则它的前序.中序.后序遍历流程如下图所示 前序遍历 class Solution:def preorderTraver ...

  7. 二叉树前序、中序、后序遍历非递归写法的透彻解析

    前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...

  8. 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

    一.基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒. 性质: 1.非空二叉树的第n层上至多有2^(n-1)个元素. 2.深度为h的二叉树至多有2^h-1个结点. 满二叉树:所有终端都 ...

  9. 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现

    二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...

  10. 二叉树前序、中序和后序遍历的非递归实现

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

最新文章

  1. 高可用、可扩展、稳定和安全的消息队列ActiveMQ特点分析
  2. JavaScript 语法基础
  3. char[],char *,string之间转换
  4. rails笔记 cache系统
  5. 02-cache的基本概念原理扫盲
  6. boost::python::detail::result相关的测试程序
  7. 在div中设置文字与内部div垂直居中
  8. 只有经验丰富的开发人员才能教您有关Java的5件事
  9. Leetcode每日一题:1356.sort-integers-by-the-number-of-1-bits(根据二进制1的个数排序)
  10. HDU 5971 2016ICPC大连 A: Wrestling Match(二分图判断)
  11. 学习手册:浅析DDoS的攻击及防御
  12. 基于原生js且非canvas实现的中国象棋(第一版)
  13. python自动拷贝U盘文件(打包成exe)
  14. Qt5开发的验厂考勤工资系统-计时计件综合版
  15. 微信公众号二次开发(1)
  16. 快讯|万博智云HyperMotion云迁移产品在华夏云网云市场上线了
  17. Android UI 测试指南之 Espresso
  18. ews java api maven_通过 EWS JAVA API读取exchange邮件
  19. 基于UI组件的Vue可视化布局、快速生成.vue代码
  20. 外卖点餐系统部分模块设计

热门文章

  1. 浅谈android应用之编程语言
  2. 质谱流式细胞技术 小笔记
  3. Youtube——如何将视频中的英文字幕转换成中文字幕
  4. 小程序游戏开发一般多少钱?游戏小程序开发制作
  5. 好用又好玩的PC端特效
  6. 如何区分P2P是互联网创新还是非法集资?最高检回应
  7. win7加入网络计算机,win7怎么加入局域网连接
  8. JavaScript基础复习下(51st)
  9. word、excle、ppt文档图标显示异常的解决方案!
  10. ubuntu16.04server安装dell服务器H750raid卡驱动