当前位置: 首页 > news >正文

根据二叉树的后序遍历以及中序遍历还原二叉树

根据二叉树的后序遍历以及中序遍历还原二叉树


【题目】
假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ,中序遍历序列为 DBGEHJACIF ,则其前序
遍历序列为 ( ) 。
A. ABCDEFGHIJ
B. ABDEGHJCFI
C. ABDEGHJFIC
D. ABDEGJHCFI




由题,后序遍历的最后一个值为A,说明本二叉树以节点A为根节点(当然,答案中第一个节点都是A,也证明了这一点)


下面给出整个分析过程
【第一步】
由后序遍历的最后一个节点可知本树根节点为【A】
加上中序遍历的结果,得知以【A】为根节点时,中序遍历结果被【A】分为两部分【DBGEHJ】【A】【CIF】
于是作出第一幅图如下


【第二步】
将已经确定了的节点从后序遍历结果中分割出去
即【DGJHEBIFC】---【A】
此时,位于后序遍历结果中的最后一个值为【C】
说明节点【C】是某棵子树的根节点
又由于【第一步】中【C】处于右子树,因此得到,【C】是右子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【CIF】中来,在【CIF】中,由于【C】是根节点,所以【IF】都是这棵子树的右子树,【CIF】子树没有左子树,于是得到下图


【第三步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHEBIF】---【CA】
此时,位于后序遍历结果中的最后一个值为【F】
说明节点【F】是某棵子树的根节点
又由于【第二步】中【F】处于右子树,因此得到,【F】是该右子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【C】【IF】中来,在【IF】中,由于【F】是根节点,所以【I】是【IF】这棵子树的左子树,于是得到下图



【第四步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHEB】---【IFCA】
此时,位于后序遍历结果中的最后一个值为【B】
说明节点【B】是某棵子树的根节点
又由于【第一步】中【B】处于【A】的左子树,因此得到,【B】是该左子树的根节点
于是回到中序遍历结果【DBGEHJ】【A】【C】【F】【I】中来,根据【B】为根节点,可以将中序遍历再次划分为【D】【B】【GEHJ】【A】【C】【F】【I】,于是得到下图




【第五步】
将已经确定了的节点从后序遍历中分割出去
即【DGJHE】---【BIFCA】
此时,位于后序遍历结果中的最后一个值为【E】
说明节点【E】是某棵子树的根节点
又由于【第四步】中【E】处于【B】的右子树,因此得到,【E】是该右子树的根节点
于是回到中序遍历结果【D】【B】【GEHJ】【A】【C】【F】【I】中来,根据【B】为根节点,可以将中序遍历再次划分为【D】【B】【G】【E】【HJ】【A】【C】【F】【I】,于是得到下图


【第六步】
将已经确定了的节点从后序遍历中分割出去
即【DGJH】---【EBIFCA】
此时,位于后序遍历结果中的最后一个值为【H】
说明节点【H】是某棵子树的根节点
又由于【第五步】中【H】处于【E】的右子树,因此得到,【H】是该右子树的根节点
于是回到中序遍历结果【D】【B】【G】【E】【HJ】【A】【C】【F】【I】中来,根据【H】为根节点,可以将中序遍历再次划分为【D】【B】【G】【E】【H】【J】【A】【C】【F】【I】,于是得到下图



至此,整棵二叉树已经还原
现在对该二叉树进行前序遍历便能得到我们想要的答案
【B】

相关文章:

  • vim相关资源
  • Android多媒体学习十一:实现仿百度图片查看功能
  • 【译】学习vi编辑器——第一章vi编辑器
  • 学生电脑何时能“成为自己”?
  • ubuntu系统安全
  • 文檔翻譯:NSOperation Class Reference
  • linux文件系统的块大小查看
  • 即时通讯开发----回音消除技术
  • 乐视网进军智能电视,产业变局或引发行业效应
  • DLL文件的原理
  • amoeba
  • 线性表 - 数据结构和算法06
  • 操作VMware vCenter Converter 实现物理机迁移到虚拟机
  • XML笔记
  • StackPanel 堆栈面板
  • [NodeJS] 关于Buffer
  • 《剑指offer》分解让复杂问题更简单
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Git的一些常用操作
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JAVA SE 6 GC调优笔记
  • Javascript Math对象和Date对象常用方法详解
  • Java-详解HashMap
  • SpringCloud集成分布式事务LCN (一)
  • Terraform入门 - 3. 变更基础设施
  • Zepto.js源码学习之二
  • 大快搜索数据爬虫技术实例安装教学篇
  • 记一次删除Git记录中的大文件的过程
  • 扑朔迷离的属性和特性【彻底弄清】
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深入 Nginx 之配置篇
  • 译自由幺半群
  • 用jQuery怎么做到前后端分离
  • 在Docker Swarm上部署Apache Storm:第1部分
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Core中Emit的使用
  • .net Signalr 使用笔记
  • .Net下的签名与混淆
  • @javax.ws.rs Webservice注解
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ NOI 2001 ] 食物链
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • []sim300 GPRS数据收发程序
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C#C++]类CLASS
  • [C++]类和对象(中)