Given preorder and inorder traversal of a tree, construct the binary tree.
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
TreeNode* build(vector<int>& preorder, int pLeft, int pRight, vector<int>& inorder, int iLeft, int iRight,
unordered_map<int, int>& m) {
if (pLeft > pRight || iLeft > iRight) return nullptr;
int i = m[preorder[pLeft]]; // the root index in inorder traversal
TreeNode* cur = new TreeNode(preorder[pLeft]);
cur->left = build(preorder, pLeft + 1, pLeft + i - iLeft, inorder, iLeft, i - 1, m);
cur->right = build(preorder, pLeft + i - iLeft + 1, pRight, inorder, i + 1, iRight, m);
return cur;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { // time: O(n); space: O(n)
// record the corresponding index of numbers in inorder traversal
unordered_map<int, int> m;
for (int i = 0; i < inorder.size(); ++i) {
m[inorder[i]] = i;
}
return build(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1, m);
}