根据先序和中序实现后序

题目:已知先序和中序的数组,求输出后序输出结果。思路:根据先序和中序去建一棵二叉树然后后序遍历二叉树

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

struct node
{
    int value;
    struct node* left;
    struct node* right;
    node(int _val) :value(_val){ left = NULL; right = NULL; }
};

node* helper(vector<int>& preorder, int i, int j, vector<int>& inorder, int ii, int jj)
{
    // tree        8 4 5 3 7 3
    // preorder    8 [4 3 3 7] [5]
    // inorder     [3 3 4 7] 8 [5]

    // 每次从 preorder 头部取一个值 mid,作为树的根节点
    // 检查 mid 在 inorder 中 的位置,则 mid 前面部分将作为 树的左子树,右部分作为树的右子树

    if (i >= j || ii >= j)
        return NULL;

    int mid = preorder[i];
    auto f = find(inorder.begin() + ii, inorder.begin() + jj, mid);

    int dis = f - inorder.begin() - ii;

    node* root = new node(mid);
    root->left = helper(preorder, i + 1, i + 1 + dis, inorder, ii, ii + dis);
    root->right = helper(preorder, i + 1 + dis, j, inorder, ii + dis + 1, jj);
    return root;
}
node* buildTree(vector<int>& preorder, vector<int>& inorder)
{
    return helper(preorder, 0, preorder.size(), inorder, 0, inorder.size());
}
void postrecursive(node *root)
{
    if (!root)return;
    if (root->left != NULL)postrecursive(root->left);
    if (root->right != NULL)postrecursive(root->right);
    cout << root->value << " ";
}
int main()
{
    int a[7] = {1,2,4,5,3,6,7};
    int b[7] = {4,2,5,1,3,7,6};
    vector<int>pre(a,a+7);
    vector<int>mid(b,b+7);
    node *root = buildTree(pre,mid);
    postrecursive(root);
    cin.get();
    return 0;
}
时间: 2024-08-03 10:18:02

根据先序和中序实现后序的相关文章

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

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

给定二叉树先序、中序遍历序列,求后序遍历

给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列. 输入描述: 输入为一行. 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔.保证数据合法 输出描述: 对应输出后序遍历序列 示例1 输入 ABDEC DBEAC 输出 DEBCA思路:先根据先序.中序序列建立二叉树,然后后序遍历 import java.util.Scanner; import javax.print.attribute.standard.PresentationDirection; cl

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

思路: 先序序列的第一个结点为要构造二叉树的根结点,在中序序列中查找二叉树的根结点,则中序列根结点左边为根结点的左子树的中序序列,右边为根结点的右子树的中序序列.而先序序列根结点后面分别为它的左子树和右子树的先序序列.有了根结点在中序序列的位置,就知道了左子树和右子树的先序序列各自的位置.这样,就知道了根结点两个子树的序列. 然后在构造了根结点后,就可以递归调用函数来勾结根结点的左子树和右子树. 以上为二叉树的恢复. 后序遍历二叉树也是用递归即可. 代码如下: string.find()   返

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

参考:http://blog.csdn.net/u010607031/article/details/37578957 //#include<stdio.h>#include<string.h>#include<iostream>using namespace std;const int N = 26;char s1[N], s2[N], ans[N];//s1[N],s2[N]分别为先序和中序遍历序列void build(int n, char* s1, char*

由二叉树的前序和中序如何得到二叉树的后序呢?

首先得明白什么是前序.中序.后序. 二叉树前序:遍历顺序为,根节点.左子树.右子树:中序:遍历顺序为,左子树.根节点.右子树:后序:遍历顺序为,左子树.右子树.根节点 可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左.右子树两个部分,然后递归调用即可. #include<iostream> using namespace std; template<class T> struct BinaryTreeNode

作业 树和森林 遍历(递归/非递归先序,递归/非递归后序,递归层次)

1 #include <iostream> 2 #include"queue.h"//之前写的类 3 #include"stack.h" //之前写的类 4 using namespace std; 5 6 template <class T> 7 class Tree; 8 9 //======================================== 10 // 树节点类声明 11 template <class T>

【基础备忘】 二叉树前序、中序、后序遍历相互求法

转自:http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2

C语言递归实现二叉树的先序、中序、后序遍历

#include <stdio.h> #include <stdlib.h> //*****二叉树的二叉链表存储表示*****// typedef struct BiNode { char data; struct BiNode *lchild, *rchild; }BiNode, *BiTree; //*****按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树构造二叉链表表示的二叉树T*****// void CreateBiTree(BiTree &T) {

Construct Binary Tree from Inorder and Postorder Traversal ——通过中序、后序遍历得到二叉树

题意:根据二叉树的中序遍历和后序遍历恢复二叉树. 解题思路:看到树首先想到要用递归来解题.以这道题为例:如果一颗二叉树为{1,2,3,4,5,6,7},则中序遍历为{4,2,5,1,6,3,7},后序遍历为{4,5,2,6,7,3,1},我们可以反推回去.由于后序遍历的最后一个节点就是树的根.也就是root=1,然后我们在中序遍历中搜索1,可以看到中序遍历的第四个数是1,也就是root.根据中序遍历的定义,1左边的数{4,2,5}就是左子树的中序遍历,1右边的数{6,3,7}就是右子树的中序遍历

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

今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2.访问根节点     3.中序遍历右子树 后序遍历:     1.后序遍历左子树     2.后序遍历右子树     3.访问