【牛客网】剑指offer编程题:重建二叉树(C++)

【牛客网】剑指offer编程题:重建二叉树(C++)

 前序遍历:先访问根节点,在访问左节点,最后访问右节点。、

 遍历结果:ABDFECGHI

【牛客网】剑指offer编程题:重建二叉树(C++)

中序遍历:先访问左节点,再访问根节点,最后访问右节点。

遍历结果:DBEFAGHCI

【牛客网】剑指offer编程题:重建二叉树(C++)

      在这个题目中要充分利用先序遍历和中序遍历的特点,先序遍历(根左右)找到根节点的位置,中序遍历(左根右)找到左子树的长度。利用递归重建二叉树。

代码:
class Solution {
public:
    unordered_map<int, int> pos;   //Map记录元素在中序遍历中的位置(便于计算左右子树的长度)
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int n = pre.size();  //记录结点个数
        for (int i = 0; i < n; i++)
            pos[vin[i]] = i;
        return dfs(pre, vin, 0, n - 1, 0, n - 1);//递归函数,重建二叉树。
    }
    
    TreeNode* dfs(vector<int> pre, vector<int> vin, int pl, int pr, int vl, int vr)
    {   // pl,pr 前序遍历的左右边界,vl,vr 中序遍历的左右边界
        // pre先序遍历(根左右) vin中序遍历(左根右)
        if (pl > pr) return NULL;
        //找根节点
        TreeNode* root = new TreeNode(pre[pl]); //先序遍历找根节点
        //左子树长度k
        int k = pos[pre[pl]] - vl;
        root -> left = dfs(pre, vin, pl + 1, pl + k, vl, vl + k - 1);
        root -> right = dfs(pre, vin, pl + k + 1, pr, vl + k + 1, vr);
        return root;
    }
    
};

【牛客网】剑指offer编程题:重建二叉树(C++)