【题目】
假设一棵二叉树的后序遍历序列为 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】
出处http://billhoo.blog.51cto.com/2337751/708872
- 大小: 4.5 KB
- 大小: 6.2 KB
- 大小: 7.3 KB
- 大小: 9.3 KB
- 大小: 11.1 KB
- 大小: 12.6 KB
分享到:
相关推荐
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
不过,以上概述了如何根据前序和中序遍历的结果来重建二叉树并输出后序遍历的过程。对于实际的编程实现,你需要根据提供的代码和数据进行调整,确保逻辑正确,并遵循二叉树遍历的规则。在进行这类问题的解决时,理解...
二叉树的遍历有多种方式,本文将介绍二叉树的递归遍历,中序遍历,先序遍历和后序遍历。 递归遍历是指使用递归函数来遍历二叉树的每个结点。递归遍历的优点是代码简洁易懂,但缺点是可能会导致堆栈溢出。在本文的...
对于已知的前序遍历(P遍历)和中序遍历(I遍历),我们可以通过以下步骤打印出后序遍历(H遍历): 1. **初始化**:创建一个空栈,记录当前中序遍历中的位置(初始为0)。 2. **匹配前序遍历**:遍历P遍历,每遇到...
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
对于题目中提到的“二叉树先中序求后序”,意味着我们已经知道了二叉树的先序和中序遍历结果,现在需要计算出后序遍历的结果。这可以通过已知的先序和中序遍历来构造二叉树,然后再进行后序遍历。 1. 首先,从先序...
数据结构C++二叉链表的先序遍历、中序遍历和后序遍历实现
本文将深入探讨四种常见的二叉树遍历方法:前序遍历、中序遍历、后序遍历以及层次遍历,并以C++编程语言为例,阐述如何实现这些遍历算法。 1. **前序遍历**(Preorder Traversal) 前序遍历的顺序是根节点 -> 左...
二叉树的遍历,全部用递归实现,很有规律! 二叉树的遍历,全部用递归实现,很有规律
本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...
这是数据结构中二叉树的后序遍历的非递归算法的源代码。
二叉树已知后序和中序遍历求前序遍历,C++编写已通过编译
二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:先序遍历、中序遍历和后序遍历。这些遍历方法可以分为递归和非递归两种实现方式。递归方式虽然简单易懂,但在实际应用中可能因为递归层数过深导致...
数据结构二叉树链式结构的前序遍历,中序遍历,后序遍历用递归的方法,层级遍历采用队列结构
6. 二叉树的构建:通过给定的前序遍历和中序遍历序列,可以构建出对应的二叉树。构建过程中需要递归地构建左子树和右子树,并将其挂载到当前节点下。 7. C++中的二叉树实现:在C++中,可以使用结构体来实现二叉树...
常见的遍历方法包括:前序遍历、中序遍历和后序遍历。 #### 4.1 前序遍历 前序遍历的顺序是先访问根节点,然后递归地进行左子树的前序遍历,最后递归地进行右子树的前序遍历。实现代码如下: ```c void Preoder...
二叉树遍历是计算机科学中一种重要的数据结构操作,主要应用于树形数据结构的处理。在软考中,理解并能熟练应用二叉树的遍历方法是必不可少的技能。这里我们详细讨论前序遍历、中序遍历、后序遍历以及层次遍历这四种...
二叉树遍历问题 二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序...
本文将深入探讨二叉树的三种主要遍历方法:前序遍历、中序遍历和后序遍历。 **前序遍历(Preorder Traversal)** 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。这意味着我们首先访问根节点,然后递归地遍历左...
假设我们有一棵二叉树,给定它的前序遍历序列和中序遍历序列,需要求出该二叉树的后序遍历序列。 #### 解决方案分析 1. **解析输入序列**:首先解析输入的前序和中序遍历序列,其中每个节点用一个小写字母表示。 2...