美文网首页Leetcode
Leetcode.105.Construct Binary Tr

Leetcode.105.Construct Binary Tr

作者: Jimmy木 | 来源:发表于2019-10-25 15:44 被阅读0次

    题目

    给定一个树的前序遍历和中序遍历, 输出二叉树.

    Input: preorder=[3,9,20,15,7], inorder=[9,3,15,20,7]
    output:
                 3
                / \
               9   20
                  /  \
                15    7
    

    思路1

    递归, 通过为子树截取新的遍历数组, 空间复杂度过大.

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if (preorder.size() <= 0) return nullptr;
        TreeNode* root = nullptr;
    
        int val = preorder[0];
        if (root == nullptr) {
            root = new TreeNode(val);
        };
    
        vector<int>::iterator iter = find(inorder.begin(),inorder.end(), val);
        int n = 0;
        if (iter != inorder.end()){
          // 迭代器位置
           n = (int)distance(inorder.begin(),iter);
        }
        vector<int> leftInorder = vector<int>(inorder.begin(), inorder.begin() + n);
        vector<int> rightInorder = vector<int>(inorder.begin() + n + 1, inorder.end());
        vector<int> leftPreorder = vector<int>(preorder.begin() + 1, preorder.begin() + 1 + leftInorder.size());
        vector<int> rightPreorder = vector<int>(preorder.begin() + 1 + leftInorder.size(), preorder.end());
    
        root->left = buildTree(leftPreorder, leftInorder);
        root->right = buildTree(rightPreorder, rightInorder);
        return root;
    }
    

    思路2

    递归, 计算出子节点的位置.

    TreeNode* buildTreeRecrution (vector<int>& preorder, vector<int>& inorder, int left, int right, int &index) {
        if (index >= preorder.size()) return nullptr;
    
        while (left < right) {
            if (preorder[index] == inorder[left]) break;
            left++;
        }
        if (left >= right) return nullptr;
    
        TreeNode *root = new TreeNode(preorder[index++]);
        root->left = buildTreeRecrution(preorder, inorder, 0, left, index);
        root->right = buildTreeRecrution(preorder, inorder, left + 1, right ,index);
        return root;
    }
    
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int index = 0;
        TreeNode* result = buildTreeRecrution(preorder, inorder, 0, (int)preorder.size(), index);
        return result;
    }
    

    总结

    关键是掌握前序和中序的关联, 分析数学问题, 找规律.

    相关文章

      网友评论

        本文标题:Leetcode.105.Construct Binary Tr

        本文链接:https://www.haomeiwen.com/subject/umnsvctx.html