已知二叉树的先序遍历序列和中序遍历序列,求后序遍历序列。

思路:

先序序列的第一个结点为要构造二叉树的根结点,在中序序列中查找二叉树的根结点,则中序列根结点左边为根结点的左子树的中序序列,右边为根结点的右子树的中序序列。而先序序列根结点后面分别为它的左子树和右子树的先序序列。有了根结点在中序序列的位置,就知道了左子树和右子树的先序序列各自的位置。这样,就知道了根结点两个子树的序列。

然后在构造了根结点后,就可以递归调用函数来勾结根结点的左子树和右子树。

以上为二叉树的恢复。

后序遍历二叉树也是用递归即可。

代码如下:

string.find()   返回查找元素的下标

string.substr(a, b)   从第a个下标的元素开始截取b个元素

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;

struct Node
{
char data;
Node * lchild;
Node * rchild;
};

Node* CreatTree(string pre, string in)
{
Node * root = NULL; //树的初始化
if(pre.length() > 0)
{
root = new Node; //为根结点申请结构体所需要的内存
root->data = pre[0]; //先序序列的第一个元素为根结点
int index = in.find(root->data); //查找中序序列中的根结点位置
root->lchild = CreatTree(pre.substr(1, index), in.substr(0, index)); //递归创建左子树
root->rchild = CreatTree(pre.substr(index + 1), in.substr(index + 1)); //递归创建右子树
}
return root;
}

void PostOrder(Node * root) //递归后序遍历
{
if(root != NULL)
{
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data;
}
}

int main()
{
string pre_str, in_str;
Node *root;
while(cin>>pre_str>>in_str)
{
root = CreatTree(pre_str, in_str);
PostOrder(root);
cout<<endl;
}
return 0;
}

时间: 2024-10-26 23:28:48

已知二叉树的先序遍历序列和中序遍历序列,求后序遍历序列。的相关文章

二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列

首先介绍一下三种遍历顺序的操作方法: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知先序和中序遍历序列,求后序遍历序列. 已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

已知二叉树的中序遍历和先序/后序遍历求后序/先序

已知两种遍历序列求原始二叉树 算法思想: 需要明确的前提条件 通过先序和中序可以求出原始二叉树 通过中序和后序可以求出原始二叉树 但是通过先序和后序无法还原出二叉树 换种说法: 只有通过先序中序或者后序中序才可以确定一个二叉树 先来看一个例子,已知先序遍历序列和中序遍历序列求后序遍历: 先序:ABCDEFGH 中序:BDCEAFHG 求后序: 分析:要求后序遍历序列,必须求出原始二叉树 先看先序序列A第一个出现,有先序遍历的定义可以知道A是根结点 再看中序遍历,A的左边是BDCE,而A的右边是F

已知二叉树的前序遍历结果和中序遍历结果,请重建原来的二叉树

分析的过程: 1.假设前序遍历的第一个值为a,该值就是原二叉树的根节点. 2.在中序遍历结果中查找a. 则在中序遍历中a前面的节点,就是原二叉树a节点左子树的中序遍历结果:在a后面的节点,就是原二叉树a节点右子树的中序遍历结果. 3.由第二步得到a节点左子树的节点个数为m,那么在前序遍历中a后面的m个节点即为a节点左子树的前序遍历结果: 4.由第二步得到a节点右子树的节点个数为n,那么在前序遍历中最后n个节点即为a节点右子树的前序遍历结果: 由此我们可以得到a节点左子树和右子树的前序遍历和中序遍

已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?

对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历.中序遍历和后序遍历.这三种方式是以访问父节点的顺序来进行命名的.假设父节点是N,左节点是L,右节点是R,那么对应的访问遍历顺序如下: 前序遍历    N->L->R 中序遍历    L->N->R 后序遍历    L->R->N /***************************************************************************************

已知二叉树的先序,中序遍历,求后续遍历

//已知二叉树的先序,中序遍历,求后续遍历 struct TreeNode { char elem; struct TreeNode* left; struct TreeNode* right; }; TreeNode* BinaryTree(char* inorder,char* preorder,int length) { if(length == 0) return NULL; TreeNode* node = new TreeNode; node->elem = *preorder; i

关于二叉树的问题1-已知前序,中序求后序遍历

对于一棵二叉树而言,可以由其前序和中序或者中序和后序的遍历序列,确定一棵二叉树. 那么对于已知前序和中序序列,求后序序列也就是先还原二叉树,然后对其进行后序遍历即可. 二叉树结点的结构定义如下: struct TreeNode { char value; TreeNode *leftChild; TreeNode *rightChild; }; 实现代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h&

已知先序遍历和中序遍历,求后序遍历

描述 先序序列{1,2,4,8,9,5,10,3,6,7};中序序列{8,4,9,2,10,5,1,6,3,7};求后序序列. 代码 class Node{ public int data; public Node left; public Node right; public Node(int data){ this.data=data; this.left=null; this.right=null; } } public class BinaryTree { private Node ro

已知前序中序求后序-二叉树

writer:pprp 思路很容易理解,但是实现还是有一点难度,容易错 参考书目:<算法竞赛宝典> 代码如下: //已知前序中序,求后序 #include <iostream> using namespace std; //a是前序,b是中序 void hwg(string a,string b) { int ll,lr; for(unsigned int i = 0; i < b.length(); i++) { if(a[0] == b[i]) //找到根节点 { ll

二叉树前序中序遍历求后序遍历

已知先序和中序遍历序列,求后序遍历序列. 已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,中序遍历序列为:D-B-G-E-A-C-F. 接下来我们就可以求出该二叉树的后序遍历序列,具体步骤如下: 第一步:先求root根节点,根据先序遍历规则我们可知root为先序遍历序列的第一个节点,因此该二叉树的root节点为A. 第二步:求root的左子树和右子树,这点我们可以从中序遍历序列中找出,位于root节点A左侧的D-B-G-E为root的左子树,位于A右侧的C-F为右子树. 第三步:求ro