Skip to content

Commit 634689c

Browse files
committed
2
1 parent 5495cea commit 634689c

File tree

1 file changed

+19
-28
lines changed

1 file changed

+19
-28
lines changed

ConstructBinaryTreefromPreorderandInorderTraversal/ConstructBinaryTreefromPreorderandInorderTraversal.cpp

+19-28
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,28 @@
99
*/
1010
class Solution {
1111
public:
12-
TreeNode *buildTree(vector<int>& preorder, vector<int>& inorder) {
13-
// Start typing your C/C++ solution below
14-
// DO NOT write int main() function
15-
16-
if (preorder.empty()) return NULL;
17-
18-
TreeNode *root = new TreeNode(0);
19-
build(root, preorder.size(), preorder, 0, inorder, 0);
20-
return root;
12+
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
13+
if (preorder.size() == 0) {
14+
return NULL;
15+
}
16+
return dfs(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
2117
}
2218

23-
void build(TreeNode *root, int size, vector<int>& preorder, int preLeft, vector<int>& inorder, int inLeft) {
24-
if (size == 1) {
25-
root->val = preorder[preLeft];
26-
return ;
27-
}
28-
int sizeLeft = 0;
29-
for (int i = 0; i < size; i++) {
30-
if (preorder[preLeft] == inorder[i+inLeft])
31-
break;
32-
sizeLeft += 1;
19+
TreeNode* dfs(vector<int>& preorder, int l1, int r1, vector<int>& inorder, int l2, int r2) {
20+
if (l1 > r1) {
21+
return NULL;
3322
}
34-
root->val = preorder[preLeft];
35-
if (sizeLeft > 0) {
36-
root->left = new TreeNode(0);
37-
build(root->left, sizeLeft, preorder, preLeft + 1, inorder, inLeft);
23+
if (l1 == r1) {
24+
return new TreeNode(preorder[l1]);
3825
}
39-
int sizeRight = size - sizeLeft - 1;
40-
if (sizeRight > 0) {
41-
root->right = new TreeNode(0);
42-
build(root->right, sizeRight, preorder, preLeft + sizeLeft + 1, inorder, inLeft + sizeLeft + 1);
26+
TreeNode* root = new TreeNode(preorder[l1]);
27+
for (int i = l2; i <= r2; i++) {
28+
if (inorder[i] == preorder[l1]) {
29+
root->left = dfs(preorder, l1 + 1, l1 + i - l2, inorder, l2, i - 1);
30+
root->right = dfs(preorder, l1 + i - l2 + 1, r1, inorder, i + 1, r2);
31+
return root;
32+
}
4333
}
34+
return NULL;
4435
}
45-
};
36+
};

0 commit comments

Comments
 (0)