49
49
# self.right = right
50
50
class Solution :
51
51
def buildTree (self , preorder : List[int ], inorder : List[int ]) -> Optional[TreeNode]:
52
- if not preorder:
53
- return None
54
- v = preorder[0 ]
55
- root = TreeNode(val = v)
56
- i = inorder.index(v)
57
- root.left = self .buildTree(preorder[1 : 1 + i], inorder[:i])
58
- root.right = self .buildTree(preorder[1 + i :], inorder[i + 1 :])
59
- return root
60
- ```
61
-
62
- ``` python
63
- # Definition for a binary tree node.
64
- # class TreeNode:
65
- # def __init__(self, val=0, left=None, right=None):
66
- # self.val = val
67
- # self.left = left
68
- # self.right = right
69
- class Solution :
70
- def buildTree (self , preorder : List[int ], inorder : List[int ]) -> Optional[TreeNode]:
71
- def dfs (i , j , n ):
52
+ def dfs (i : int , j : int , n : int ):
72
53
if n <= 0 :
73
54
return None
74
55
v = preorder[i]
75
56
k = d[v]
76
- root = TreeNode(v)
77
- root.left = dfs(i + 1 , j, k - j)
78
- root.right = dfs(i + 1 + k - j, k + 1 , n - k + j - 1 )
79
- return root
57
+ l = dfs(i + 1 , j, k - j)
58
+ r = dfs(i + 1 + k - j, k + 1 , n - k + j - 1 )
59
+ return TreeNode(v, l, r)
80
60
81
61
d = {v: i for i, v in enumerate (inorder)}
82
62
return dfs(0 , 0 , len (preorder))
83
63
```
84
64
65
+ ``` python
66
+ class Solution :
67
+ def getBinaryTrees (self , preOrder : List[int ], inOrder : List[int ]) -> List[TreeNode]:
68
+ def dfs (i : int , j : int , n : int ) -> List[TreeNode]:
69
+ if n <= 0 :
70
+ return [None ]
71
+ v = preOrder[i]
72
+ ans = []
73
+ for k in d[v]:
74
+ if j <= k < j + n:
75
+ for l in dfs(i + 1 , j, k - j):
76
+ for r in dfs(i + 1 + k - j, k + 1 , n - 1 - (k - j)):
77
+ ans.append(TreeNode(v, l, r))
78
+ return ans
79
+
80
+ d = defaultdict(list )
81
+ for i, x in enumerate (inOrder):
82
+ d[x].append(i)
83
+ return dfs(0 , 0 , len (preOrder))
84
+ ```
85
+
85
86
### ** Java**
86
87
87
88
``` java
@@ -101,25 +102,71 @@ class Solution:
101
102
* }
102
103
*/
103
104
class Solution {
104
- private Map<Integer , Integer > indexes = new HashMap<> ();
105
+ private int [] preorder;
106
+ private int [] inorder;
107
+ private Map<Integer , Integer > d = new HashMap<> ();
108
+
109
+ public TreeNode buildTree (int [] preorder , int [] inorder ) {
110
+ int n = preorder. length;
111
+ this . preorder = preorder;
112
+ this . inorder = inorder;
113
+ for (int i = 0 ; i < n; ++ i) {
114
+ d. put(inorder[i], i);
115
+ }
116
+ return dfs(0 , 0 , n);
117
+ }
118
+
119
+ private TreeNode dfs (int i , int j , int n ) {
120
+ if (n <= 0 ) {
121
+ return null ;
122
+ }
123
+ int v = preorder[i];
124
+ int k = d. get(v);
125
+ TreeNode l = dfs(i + 1 , j, k - j);
126
+ TreeNode r = dfs(i + 1 + k - j, k + 1 , n - 1 - (k - j));
127
+ return new TreeNode (v, l, r);
128
+ }
129
+ }
130
+ ```
131
+
132
+ ``` java
133
+ /**
134
+ * Definition for a binary tree node.
135
+ * public class TreeNode {
136
+ * int val;
137
+ * TreeNode left;
138
+ * TreeNode right;
139
+ * TreeNode() {}
140
+ * TreeNode(int val) { this.val = val; }
141
+ * TreeNode(int val, TreeNode left, TreeNode right) {
142
+ * this.val = val;
143
+ * this.left = left;
144
+ * this.right = right;
145
+ * }
146
+ * }
147
+ */
148
+ class Solution {
149
+ private int [] preorder;
150
+ private Map<Integer , Integer > d = new HashMap<> ();
105
151
106
152
public TreeNode buildTree (int [] preorder , int [] inorder ) {
107
- for (int i = 0 ; i < inorder. length; ++ i) {
108
- indexes. put(inorder[i], i);
153
+ int n = preorder. length;
154
+ this . preorder = preorder;
155
+ for (int i = 0 ; i < n; ++ i) {
156
+ d. put(inorder[i], i);
109
157
}
110
- return dfs(preorder, inorder, 0 , 0 , preorder . length );
158
+ return dfs(0 , 0 , n );
111
159
}
112
160
113
- private TreeNode dfs (int [] preorder , int [] inorder , int i , int j , int n ) {
161
+ private TreeNode dfs (int i , int j , int n ) {
114
162
if (n <= 0 ) {
115
163
return null ;
116
164
}
117
165
int v = preorder[i];
118
- int k = indexes. get(v);
119
- TreeNode root = new TreeNode (v);
120
- root. left = dfs(preorder, inorder, i + 1 , j, k - j);
121
- root. right = dfs(preorder, inorder, i + 1 + k - j, k + 1 , n - k + j - 1 );
122
- return root;
166
+ int k = d. get(v);
167
+ TreeNode l = dfs(i + 1 , j, k - j);
168
+ TreeNode r = dfs(i + 1 + k - j, k + 1 , n - 1 - (k - j));
169
+ return new TreeNode (v, l, r);
123
170
}
124
171
}
125
172
```
@@ -140,21 +187,68 @@ class Solution {
140
187
*/
141
188
class Solution {
142
189
public:
143
- unordered_map<int, int> indexes;
144
-
145
190
TreeNode* buildTree(vector<int >& preorder, vector<int >& inorder) {
146
- for (int i = 0; i < inorder.size(); ++i) indexes[inorder[i]] = i;
147
- return dfs(preorder, inorder, 0, 0, inorder.size());
191
+ int n = preorder.size();
192
+ unordered_map<int, int> d;
193
+ for (int i = 0; i < n; ++i) {
194
+ d[ inorder[ i]] = i;
195
+ }
196
+ function<TreeNode* (int, int, int)> dfs = [ &] (int i, int j, int n) -> TreeNode* {
197
+ if (n <= 0) {
198
+ return nullptr;
199
+ }
200
+ int v = preorder[ i] ;
201
+ int k = d[ v] ;
202
+ TreeNode* l = dfs(i + 1, j, k - j);
203
+ TreeNode* r = dfs(i + 1 + k - j, k + 1, n - 1 - (k - j));
204
+ return new TreeNode(v, l, r);
205
+ };
206
+ return dfs(0, 0, n);
148
207
}
208
+ };
209
+ ```
149
210
150
- TreeNode* dfs (vector<int >& preorder, vector<int >& inorder, int i, int j, int n) {
151
- if (n <= 0) return nullptr;
152
- int v = preorder[ i] ;
153
- int k = indexes[ v] ;
154
- TreeNode* root = new TreeNode(v);
155
- root->left = dfs(preorder, inorder, i + 1, j, k - j);
156
- root->right = dfs(preorder, inorder, i + 1 + k - j, k + 1, n - k + j - 1);
157
- return root;
211
+ ```cpp
212
+ /**
213
+ * struct TreeNode {
214
+ * int val;
215
+ * struct TreeNode *left;
216
+ * struct TreeNode *right;
217
+ * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
218
+ * };
219
+ */
220
+ class Solution {
221
+ public:
222
+ vector<TreeNode*> getBinaryTrees(vector<int>& preOrder, vector<int>& inOrder) {
223
+ int n = inOrder.size();
224
+ unordered_map<int, vector<int>> d;
225
+ for (int i = 0; i < n; ++i) {
226
+ d[inOrder[i]].push_back(i);
227
+ }
228
+ function<vector<TreeNode*>(int, int, int)> dfs = [&](int i,int j, int n) -> vector<TreeNode*> {
229
+ vector<TreeNode*> ans;
230
+ if (n <= 0) {
231
+ ans.push_back(nullptr);
232
+ return ans;
233
+ }
234
+ int v = preOrder[i];
235
+ for (int k : d[v]) {
236
+ if (k >= j && k < j + n) {
237
+ auto lefts = dfs(i + 1, j, k - j);
238
+ auto rights = dfs(i + 1 + k - j, k + 1, n - 1 - (k - j));
239
+ for (TreeNode* l : lefts) {
240
+ for (TreeNode* r : rights) {
241
+ TreeNode* node = new TreeNode(v);
242
+ node->left = l;
243
+ node->right = r;
244
+ ans.push_back(node);
245
+ }
246
+ }
247
+ }
248
+ }
249
+ return ans;
250
+ };
251
+ return dfs(0, 0, n);
158
252
}
159
253
};
160
254
```
@@ -171,23 +265,54 @@ public:
171
265
* }
172
266
*/
173
267
func buildTree (preorder []int , inorder []int ) *TreeNode {
174
- indexes := make( map[int]int)
175
- for i, v := range inorder {
176
- indexes[v ] = i
268
+ d := map [int ]int {}
269
+ for i , x := range inorder {
270
+ d[x ] = i
177
271
}
178
272
var dfs func (i, j, n int ) *TreeNode
179
273
dfs = func (i, j, n int ) *TreeNode {
180
274
if n <= 0 {
181
275
return nil
182
276
}
183
277
v := preorder[i]
184
- k := indexes[v]
185
- root := &TreeNode{Val: v}
186
- root.Left = dfs(i+1, j, k-j)
187
- root.Right = dfs(i+1+k-j, k+1, n-k+j-1)
188
- return root
278
+ k := d[v]
279
+ l := dfs (i+1 , j, k-j)
280
+ r := dfs (i+1 +k-j, k+1 , n-1 -(k-j))
281
+ return &TreeNode{v, l, r}
189
282
}
190
- return dfs(0, 0, len(inorder))
283
+ return dfs (0 , 0 , len (preorder))
284
+ }
285
+ ```
286
+
287
+ ``` go
288
+ func getBinaryTrees (preOrder []int , inOrder []int ) []*TreeNode {
289
+ n := len (preOrder)
290
+ d := map [int ][]int {}
291
+ for i , x := range inOrder {
292
+ d[x] = append (d[x], i)
293
+ }
294
+ var dfs func (i, j, n int ) []*TreeNode
295
+ dfs = func (i, j, n int ) []*TreeNode {
296
+ ans := []*TreeNode{}
297
+ if n <= 0 {
298
+ ans = append (ans, nil )
299
+ return ans
300
+ }
301
+ v := preOrder[i]
302
+ for _ , k := range d[v] {
303
+ if k >= j && k < j+n {
304
+ lefts := dfs (i+1 , j, k-j)
305
+ rights := dfs (i+1 +k-j, k+1 , n-1 -(k-j))
306
+ for _ , left := range lefts {
307
+ for _ , right := range rights {
308
+ ans = append (ans, &TreeNode{v, left, right})
309
+ }
310
+ }
311
+ }
312
+ }
313
+ return ans
314
+ }
315
+ return dfs (0 , 0 , n)
191
316
}
192
317
```
193
318
@@ -209,17 +334,22 @@ func buildTree(preorder []int, inorder []int) *TreeNode {
209
334
*/
210
335
211
336
function buildTree(preorder : number [], inorder : number []): TreeNode | null {
212
- const n = preorder .length ;
213
- if (n === 0 ) {
214
- return null ;
337
+ const d: Map <number , number > = new Map ();
338
+ const n = inorder .length ;
339
+ for (let i = 0 ; i < n ; ++ i ) {
340
+ d .set (inorder [i ], i );
215
341
}
216
- const val = preorder [0 ];
217
- const index = inorder .indexOf (val );
218
- return new TreeNode (
219
- val ,
220
- buildTree (preorder .slice (1 , index + 1 ), inorder .slice (0 , index )),
221
- buildTree (preorder .slice (index + 1 ), inorder .slice (index + 1 )),
222
- );
342
+ const dfs = (i : number , j : number , n : number ): TreeNode | null => {
343
+ if (n <= 0 ) {
344
+ return null ;
345
+ }
346
+ const v = preorder [i ];
347
+ const k = d .get (v )! ;
348
+ const l = dfs (i + 1 , j , k - j );
349
+ const r = dfs (i + 1 + k - j , k + 1 , n - 1 - (k - j ));
350
+ return new TreeNode (v , l , r );
351
+ };
352
+ return dfs (0 , 0 , n );
223
353
}
224
354
```
225
355
@@ -246,22 +376,26 @@ function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
246
376
// }
247
377
use std :: rc :: Rc ;
248
378
use std :: cell :: RefCell ;
379
+ use std :: collections :: HashMap ;
249
380
impl Solution {
250
- fn to_tree (preorder : & [i32 ], inorder : & [i32 ]) -> Option <Rc <RefCell <TreeNode >>> {
251
- if preorder . is_empty () {
252
- return None ;
381
+ pub fn build_tree (preorder : Vec <i32 >, inorder : Vec <i32 >) -> Option <Rc <RefCell <TreeNode >>> {
382
+ let mut d = HashMap :: new ();
383
+ for (i , & x ) in inorder . iter (). enumerate () {
384
+ d . insert (x , i );
253
385
}
254
- let val = preorder [0 ];
255
- let index = inorder . iter (). position (| & v | v == val ). unwrap ();
256
- Some (Rc :: new (RefCell :: new (TreeNode {
257
- val ,
258
- left : Self :: to_tree (& preorder [1 .. index + 1 ], & inorder [.. index ]),
259
- right : Self :: to_tree (& preorder [index + 1 .. ], & inorder [index + 1 .. ]),
260
- })))
386
+ Self :: dfs (& preorder , & d , 0 , 0 , preorder . len ())
261
387
}
262
388
263
- pub fn build_tree (preorder : Vec <i32 >, inorder : Vec <i32 >) -> Option <Rc <RefCell <TreeNode >>> {
264
- Self :: to_tree (& preorder [.. ], & inorder [.. ])
389
+ pub fn dfs (preorder : & Vec <i32 >, d : & HashMap <i32 , usize >, i : usize , j : usize , n : usize ) -> Option <Rc <RefCell <TreeNode >>> {
390
+ if n <= 0 {
391
+ return None ;
392
+ }
393
+ let v = preorder [i ];
394
+ let k = d [& v ];
395
+ let mut root = TreeNode :: new (v );
396
+ root . left = Self :: dfs (preorder , d , i + 1 , j , k - j );
397
+ root . right = Self :: dfs (preorder , d , i + k - j + 1 , k + 1 , n - k + j - 1 );
398
+ Some (Rc :: new (RefCell :: new (root )))
265
399
}
266
400
}
267
401
```
@@ -283,22 +417,22 @@ impl Solution {
283
417
* @return {TreeNode}
284
418
*/
285
419
var buildTree = function (preorder , inorder ) {
286
- function dfs (i , j , n ) {
420
+ const d = new Map ();
421
+ const n = inorder .length ;
422
+ for (let i = 0 ; i < n; ++ i) {
423
+ d .set (inorder[i], i);
424
+ }
425
+ const dfs = (i , j , n ) => {
287
426
if (n <= 0 ) {
288
427
return null ;
289
428
}
290
429
const v = preorder[i];
291
- const k = d[v];
292
- const root = new TreeNode (v);
293
- root .left = dfs (i + 1 , j, k - j);
294
- root .right = dfs (i + 1 + k - j, k + 1 , n - k + j - 1 );
295
- return root;
296
- }
297
- const d = new Map ();
298
- for (const [i , v ] of inorder .entries ()) {
299
- d[v] = i;
300
- }
301
- return dfs (0 , 0 , inorder .length );
430
+ const k = d .get (v);
431
+ const l = dfs (i + 1 , j, k - j);
432
+ const r = dfs (i + 1 + k - j, k + 1 , n - 1 - (k - j));
433
+ return new TreeNode (v, l, r);
434
+ };
435
+ return dfs (0 , 0 , n);
302
436
};
303
437
```
304
438
0 commit comments