递归重建二叉树

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    unordered_map<int, int> index;
public:
    TreeNode* myBuildTree(const vector<int>& pre, const vector<int>& vin, int pre_left, int pre_right, int vin_left, int vin_right) {
        if(pre_left > pre_right)
            return nullptr;
        // 前序遍历中的第一个节点就是根节点
        int pre_root = pre_left;
        // 在中序遍历中定位根节点
        int vin_root = index[pre[pre_root]];
        // 先把根节点建立出来
        TreeNode* root = new TreeNode(pre[pre_root]);
        // 得到左子树中的节点数目
        int size_left_subtree = vin_root - vin_left;
         // 递归地构造左子树,并连接到根节点
        // 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素
        root->left = myBuildTree(pre, vin, pre_left + 1, pre_left + size_left_subtree, vin_left, vin_root);
        // 递归地构造右子树,并连接到根节点
        // 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素
        root->right = myBuildTree(pre, vin, pre_left + size_left_subtree + 1, pre_right, vin_root + 1, vin_right);
        return root;

    }
    TreeNode* reConstructBinaryTree(vector<int>& pre,vector<int>& vin) {
        int n = pre.size();
        // 构造哈希映射,帮助我们快速定位根节点
        for(int i = 0; i < n; i++)
            index[vin[i]] = i;
        return myBuildTree(pre, vin, 0, n - 1, 0, n - 1);
    }
};