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?