首先,我们看看前序、中序、后序遍历的特性:
前序遍历:
1.访问根节点
2.前序遍历左子树
3.前序遍历右子树
中序遍历:
1.中序遍历左子树
2.访问根节点
3.中序遍历右子树
后序遍历:
1.后序遍历左子树
2.后序遍历右子树
3.访问根节点
好了,先说说用前序遍历和中序遍历求后序遍历
假设前序遍历为 adbgcefh, 中序遍历为 dgbaechf
前序遍历是先访问根节点,然后再访问子树的,而中序遍历则先访问左子树再访问根节点
那么把前序的 a 取出来,然后查找 a 在中序遍历中的位置就得到 dgb a echf
那么我们就知道 dgb 是左子树 echf 是右子树,因为数量要吻合
所以前序中相应的 dbg 是左子树 cefh 是右子树
然后就变成了一个递归的过程,具体代码如下:
#include <iostream>
#include <string>
using namespace std;
int find(const string &str, char c)
{
for (int i = 0; i < str.size(); ++ i)
if (c == str[i])
return i;
return -1;
}
bool PreMid(const string &pre, const string &mid)
{
if (pre.size() == 0)
return false;
if (pre.size() == 1)
{
cout << pre;
return true;
}
//根节点是第一个元素
int k = find(mid, pre[0]);
string pretmp = pre.substr(1, k);
string midtmp = mid.substr(0, k);
PreMid(pretmp, midtmp);
pretmp = pre.substr(k + 1, pre.size() - k - 1);
midtmp = mid.substr(k + 1, mid.size() - k - 1);
PreMid(pretmp, midtmp);
//变成后序遍历要最后输出节点的值
cout << pre[0];
}
int main()
{
string pre, mid;
while (cin >> pre >> mid)
{
PreMid(pre, mid);
cout << endl;
}
}
而已知后序遍历和中序遍历求前序遍历的过程差不多,但由于后序遍历是最后才访问根节点的
所以要从后开始搜索,例如上面的例子,后序遍历为 gbdehfca,中序遍历为 dgbaechf
后序遍历中的最后一个元素是根节点,a,然后查找中序中a的位置
把中序遍历分成 dgb a echf,而因为节点个数要对应
后序遍历分为 gbd ehfc a,gbd为左子树,ehfc为右子树,这样又可以递归计算了
其他一些附带的代码上面已经有,这里就不重复贴了,具体代码如下:
bool BackMid(const string &back, const string &mid)
{
if (back.size() == 0)
return false;
if (back.size() == 1)
{
cout << back;
return true;
}
//根节点是最后一个元素
int k = find(mid, back[back.size() - 1]);
//变成前序遍历要先输出节点的值
cout << back[back.size() - 1];
string backTmp = back.substr(0, k);
string midTmp = mid.substr(0, k);
BackMid(backTmp, midTmp);
backTmp = back.substr(k, back.size() - k - 1);
midTmp = mid.substr(k + 1, mid.size() - k - 1);
BackMid(backTmp, midTmp);
}
分享到:
相关推荐
这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -> 左子树 -> 右子树 **中序遍历**:左子树 -> 根节点 -> 右子树 **后序遍历**:左子树 -> 右子...
数据结构C++二叉链表的先序遍历、中序遍历和后序遍历实现
已知中序遍历和后序遍历,求前序遍历。有比较详尽的中文注释。
常见的遍历方式有前序遍历、中序遍历和后序遍历。 3. 前序遍历:前序遍历是一种遍历方式,先访问当前节点,然后递归地访问左子节点和右子节点。其顺序是:当前节点 -> 左子节点 -> 右子节点。 4. 中序遍历:中序...
对于题目中提到的“二叉树先中序求后序”,意味着我们已经知道了二叉树的先序和中序遍历结果,现在需要计算出后序遍历的结果。这可以通过已知的先序和中序遍历来构造二叉树,然后再进行后序遍历。 1. 首先,从先序...
根据给定文件的信息,本文将围绕“已知先序和中序遍历序列,求后序遍历序列”的核心主题进行展开,详细解析其中涉及的数据结构与算法,并深入理解其在C语言中的实现细节。 ### 数据结构:二叉树 在计算机科学中,*...
假设我们有一棵二叉树,给定它的前序遍历序列和中序遍历序列,需要求出该二叉树的后序遍历序列。 #### 解决方案分析 1. **解析输入序列**:首先解析输入的前序和中序遍历序列,其中每个节点用一个小写字母表示。 2...
二叉树已知后序和中序遍历求前序遍历,C++编写已通过编译
二叉树已知前序和中序遍历,求后序遍历,C++代码已编译通过,可直接运行
C语言,数据结构课程,知道中序和后序遍历,画二叉树和写出前序遍历。
假设我们已知二叉树的前序遍历序列和中序遍历序列,现在需要推导出后序遍历序列。这里通过一个具体的例子来讲解整个过程: **例:** - 前序遍历: GDAFEMHZ - 中序遍历: ADEFGHMZ **画树求法:** 1. **确定根节点*...
其中,二叉树的遍历是理解二叉树的基础之一,常见的遍历方法有先序遍历、中序遍历和后序遍历。 - **先序遍历**:访问顺序为“根—左—右”。 - **中序遍历**:访问顺序为“左—根—右”。 - **后序遍历**:访问顺序...
已知中序,前序和后序,中序,恢复二叉树 本文将详细介绍如何根据中序和后序、或中序和先序序列来恢复二叉树。我们将通过对代码的解释,详细介绍如何使用递归函数来构建二叉树,并使用先序和后序遍历来验证结果。 ...
常见的二叉树遍历方法包括前序遍历、中序遍历和后序遍历。 #### 1. 前序遍历(Preorder Traversal) 前序遍历的顺序是:先访问根节点,然后遍历左子树,最后遍历右子树。 - **示例代码**: ```c void preorder...
根据前序和中序遍历序列,我们可以唯一地恢复一棵二叉树。下面我们将详细探讨这个过程。 首先,前序遍历的顺序是根节点 -> 左子树 -> 右子树,而中序遍历的顺序是左子树 -> 根节点 -> 右子树。这两个序列结合可以...
只有二叉树中每个节点度为 2 或者 0 的时候,已知前序遍历序列和后序遍历序列,才能唯一地确定一颗二叉树,如果二叉树中存在度为 1 的节点时是无法唯一地确定一棵
递归建立二叉树通常基于已知的节点序列,如前序遍历、中序遍历或后序遍历的序列。这些遍历方式提供了构建树的信息,因为它们决定了节点的相对位置。以下是三种遍历方法的定义: 1. 前序遍历:先访问根节点,然后...
本篇内容主要探讨的是如何从中序遍历结果转换到前序遍历或后序遍历的结果,这一过程不仅有助于加深对二叉树遍历的理解,而且对于实际编程问题解决也有很大的帮助。 ### 中序遍历 中序遍历的顺序是:左子树 - 根...
4. **已知二叉树前序和中序序列还原二叉树** 前序遍历的第一个元素是根节点,中序遍历将根节点左侧的元素放在左侧子树,右侧的元素放在右侧子树。因此,可以先找到前序遍历中根节点的位置,然后分别构建左侧和右侧...