Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
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.
preorder
and inorder
arrays are valid and represent the same tree?
Steps to Construct the Tree:
preorder
.inorder
to determine the boundary of left and right subtrees.Helper Data Structures:
inorder
array.#include <vector>
#include <unordered_map>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* buildTree(std::vector<int>& preorder, std::vector<int>& inorder) {
std::unordered_map<int, int> inorder_map;
for (int i = 0; i < inorder.size(); ++i) {
inorder_map[inorder[i]] = i;
}
return buildTreeHelper(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1, inorder_map);
}
private:
TreeNode* buildTreeHelper(const std::vector<int>& preorder, int preStart, int preEnd,
const std::vector<int>& inorder, int inStart, int inEnd,
std::unordered_map<int, int>& inorder_map) {
if (preStart > preEnd || inStart > inEnd) return nullptr;
int rootVal = preorder[preStart];
TreeNode* root = new TreeNode(rootVal);
int rootIndexInorder = inorder_map[rootVal];
int leftTreeSize = rootIndexInorder - inStart;
root->left = buildTreeHelper(preorder, preStart + 1, preStart + leftTreeSize,
inorder, inStart, rootIndexInorder - 1, inorder_map);
root->right = buildTreeHelper(preorder, preStart + leftTreeSize + 1, preEnd,
inorder, rootIndexInorder + 1, inEnd, inorder_map);
return root;
}
};
inorder_map
).Overall Time Complexity: O(n).
This approach ensures that we efficiently construct the binary tree from the preorder and inorder traversal arrays.
Got blindsided by a question you didn’t expect?
Spend too much time studying?
Or simply don’t have the time to go over all 3000 questions?