给定两个整数数组 inorderpostorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树

    示例 1:

    106中序后续构造二叉树 - 图1

    1. 输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
    2. 输出:[3,9,20,null,null,15,7]

    示例 2:

    1. 输入:inorder = [-1], postorder = [-1]
    2. 输出:[-1]

    提示:

    • 1 <= inorder.length <= 3000
    • postorder.length == inorder.length
    • -3000 <= inorder[i], postorder[i] <= 3000
    • inorderpostorder 都由 不同 的值组成
    • postorder 中每一个值都在 inorder
    • inorder 保证是树的中序遍历
    • postorder 保证是树的后序遍历
    class Solution {
    public:
    
        TreeNode* pre(vector<int>& inord,vector<int> &postord ){
            if(postord.size() == 0) return nullptr;
            //root的val
            int rootval=postord[postord.size() -1];
            TreeNode* root=new TreeNode();
            root->val=rootval;
            if(postord.size() == 1) return root;
            //找到mid
            int mid;
            for (mid = 0; mid<inord.size(); mid++) {
                if (inord[mid] ==rootval) break;
            }
    
            vector<int> leftin(inord.begin(),inord.begin()+mid);
            vector<int> rightin(inord.begin() +mid+1,inord.end()); //end是取不到的
    
            vector<int> leftpost(postord.begin(),postord.begin()+mid);
            vector<int> rightpost(postord.begin() +mid,postord.begin() +mid+rightin.size());
    
            root->left=pre(leftin,leftpost);
            root->right=pre(rightin,rightpost);
    
            return root;
        }
        TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
            if(inorder.size() == 0||postorder.size() == 0) return nullptr;
            return pre(inorder,postorder);
        }
    };