跳至主要内容

105. Construct Binary Tree from Preorder and Inorder Traversal

/*
* @lc app=leetcode id=105 lang=cpp
*
* [105] Construct Binary Tree from Preorder and Inorder Traversal
*
* https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/
*
* algorithms
* Medium (65.35%)
* Likes: 15764
* Dislikes: 569
* Total Accepted: 1.5M
* Total Submissions: 2.3M
* Testcase Example: '[3,9,20,15,7]\n[9,3,15,20,7]'
*
* Given two integer arrays preorder and inorder where preorder is the preorder
* traversal of a binary tree and inorder is the inorder traversal of the same
* tree, construct and return the binary tree.
*
*
* Example 1:
*
*
* Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
* Output: [3,9,20,null,null,15,7]
*
*
* Example 2:
*
*
* Input: preorder = [-1], inorder = [-1]
* Output: [-1]
*
*
*
* Constraints:
*
*
* 1 <= preorder.length <= 3000
* inorder.length == preorder.length
* -3000 <= preorder[i], inorder[i] <= 3000
* preorder and inorder consist of unique values.
* Each value of inorder also appears in preorder.
* preorder is guaranteed to be the preorder traversal of the tree.
* inorder is guaranteed to be the inorder traversal of the tree.
*
*
*/

// @lc code=start
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
int rootIndex = 0;
unordered_map<int, int> indexMap;
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
int n = preorder.size();

for(int i = 0; i < n; ++i)
{
indexMap[inorder[i]] = i;
}
return build(preorder, 0, n - 1);
}

TreeNode* build(vector<int>& preorder, int left, int right)
{
if(left > right) return nullptr;

int rootValue = preorder[rootIndex++];

TreeNode* root = new TreeNode(rootValue);

root->left = build(preorder, left, indexMap[rootValue] - 1);

root->right = build(preorder, indexMap[rootValue] + 1, right);
return root;
}
};
// @lc code=end
  • T: O(N)O(N)
  • S: O(N)O(N)