根据先序和中序实现后序

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

#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;
}

 

posted @ 2016-09-07 16:47  mahaitao617  阅读(475)  评论(0编辑  收藏  举报