• 根据先序和中序实现后序


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

    #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;
    }
  • 相关阅读:
    sql基础笔记备忘
    论坛---挂掉的思考
    http response
    跑步肋骨下方疼
    Golang
    svn rollback: 恢复到上一版本
    中国时区
    crontab
    初识redis
    siege
  • 原文地址:https://www.cnblogs.com/mahaitao/p/5850048.html
Copyright © 2020-2023  润新知