Skip to content

Commit eb75cda

Browse files
authored
Update and rename buildTreeWithPostOrder.cpp to construct-binary-tree-from-inorder-and-postorder-traversal.cpp
1 parent 0a8647c commit eb75cda

File tree

2 files changed

+43
-35
lines changed

2 files changed

+43
-35
lines changed

C++/buildTreeWithPostOrder.cpp

-35
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Time: O(n)
2+
// Space: O(n)
3+
4+
/**
5+
* Definition for a binary tree node.
6+
* struct TreeNode {
7+
* int val;
8+
* TreeNode *left;
9+
* TreeNode *right;
10+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
11+
* };
12+
*/
13+
class Solution {
14+
public:
15+
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
16+
unordered_map<int, size_t> in_entry_idx_map;
17+
for (size_t i = 0; i < inorder.size(); ++i) {
18+
in_entry_idx_map.emplace(inorder[i], i);
19+
}
20+
return ReconstructPostInOrdersHelper(postorder, 0, postorder.size(), inorder, 0, inorder.size(),
21+
in_entry_idx_map);
22+
}
23+
24+
TreeNode * ReconstructPostInOrdersHelper(const vector<int>& postorder, size_t post_s, size_t post_e,
25+
const vector<int>& inorder, size_t in_s, size_t in_e,
26+
const unordered_map<int, size_t>& in_entry_idx_map) {
27+
if (post_s == post_e || in_s == in_e) {
28+
return nullptr;
29+
}
30+
31+
auto idx = in_entry_idx_map.at(postorder[post_e - 1]);
32+
auto left_tree_size = idx - in_s;
33+
34+
TreeNode *node = new TreeNode(postorder[post_e - 1]);
35+
// Recursively builds the left subtree.
36+
node->left =ReconstructPostInOrdersHelper(postorder, post_s, post_s + left_tree_size,
37+
inorder, in_s, idx, in_entry_idx_map);
38+
// Recursively builds the right subtree.
39+
node->right = ReconstructPostInOrdersHelper(postorder, post_s + left_tree_size, post_e - 1,
40+
inorder, idx + 1, in_e, in_entry_idx_map);
41+
return node;
42+
}
43+
};

0 commit comments

Comments
 (0)