889. Construct Binary Tree from Preorder and Postorder Traversal
Input: pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
Output: [1,2,3,4,5,6,7]TreeNode* helper(vector<int>& pre, int preL, int preR, vector<int>& post, int postL, int postR, unordered_map<int, int>& m) {
if (preL > preR || postL > postR) return nullptr;
TreeNode* node = new TreeNode(pre[preL]);
if (preL == preR) return node;
// the corresponding index in post-order traversal
int idx = m[pre[preL + 1]];
node->left = helper(pre, preL + 1, preL + 1 + (idx - postL), post, postL, idx, m);
node->right = helper(pre, preL + 1 + (idx - postL) + 1, preR, post, idx + 1, postR - 1, m);
return node;
}
TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) { // time: O(n); space: O(n)
// record the corresponding index of numbers in post-order traversal
unordered_map<int, int> m;
for (int i = 0; i < post.size(); ++i) m[post[i]] = i;
return helper(pre, 0, pre.size() - 1, post, 0, post.size() - 1, m);
}Last updated