9
9
*/
10
10
class Solution {
11
11
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 );
21
17
}
22
18
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 ;
33
22
}
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]);
38
25
}
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
+ }
43
33
}
34
+ return NULL ;
44
35
}
45
- };
36
+ };
0 commit comments