4、重建二叉树 (给出前序中序,重建二叉树) 好题 绝对的好题

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

示例1
输入

[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]

返回值

{1,2,5,3,4,6,7}
1、力扣上的一种解法

需要首先熟悉二叉树先序遍历与中序遍历的规则。
先找到preorder中的起始元素作为根节点,在inorder中找到根节点的索引mid;那么pre[1:mid] 为左子树,pre[mid+1:] 为右子树。 inorder[0:mid-1] 为左子树,inorder[mid+1:] 为右子树,然后递归建立二叉树。

TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
         if (pre.size() == 0 || vin.size() == 0) {
            return NULL;
        }
        TreeNode* treeNode = new TreeNode(pre[0]);
        int mid = distance(begin(vin), find(vin.begin(), vin.end(), pre[0]));
        vector<int> left_pre(pre.begin() + 1, pre.begin() + mid + 1);
        vector<int> right_pre(pre.begin() + mid + 1, pre.end());
        vector<int> left_in(vin.begin(), vin.begin() + mid);
        vector<int> right_in(vin.begin() + mid + 1, vin.end());

        treeNode->left = reConstructBinaryTree(left_pre, left_in);
        treeNode->right = reConstructBinaryTree(right_pre, right_in);
        return treeNode;
    }

五分钟学算法公众号解析:https://mp.weixin.qq.com/s/QHt9fGP-q8RAs8GI7fP3hw

2、借助哈希来进行加速的一种做法
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {

    unordered_map<int, int> unmp;
    for (int