Leetcode C++: 剑指 Offer 07. 重建二叉树 (根据前序遍历和中序遍历的结果)

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

思路:

前序遍历:[根,[根的左],[根的右]]

中序遍历:[[根的左],根,[根的右]]

我们需要根据前序遍历的根节点的值去定位到中序遍历中root的位置,

根据该位置以及中序遍历的右边界计算出root的左边的节点个数, 然后new一个root,通过递归给root->left和root->right赋值

递归函数的参数需要包含 前中序遍历 以及 前序遍历和中序遍历的左右边界:

     递归结束条件:  左边界 > 有边界

class Solution {
    unordered_map<int,int> mymap;
public:
    TreeNode* recurseBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preleft, int preright, int inleft, int inright) {
        if(preleft > preright) return nullptr;
        int preroot = preleft;
        int inroot = mymap[preorder[preroot]];
        int leftsize = inroot - inleft;
        TreeNode* root = new TreeNode(preorder[preroot]);
        root -> left = recurseBuildTree(preorder, inorder, preleft + 1, preleft + leftsize, inleft, inroot - 1);
        root -> right = recurseBuildTree(preorder, inorder, preleft + leftsize + 1, preright, inroot + 1, inright);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        for(int i = 0; i < n; i++) {
            mymap[inorder[i]] = i;
        }
        return recurseBuildTree(preorder, inorder, 0, n-1, 0, n-1);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44189622/article/details/130063257