首页 > 代码库 > 根据先序和中序实现后序

根据先序和中序实现后序

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

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

 

根据先序和中序实现后序