@@ -99,13 +99,11 @@ class Solution:
99
99
*/
100
100
class Solution {
101
101
private int [] preorder;
102
- private int [] inorder;
103
102
private Map<Integer , Integer > d = new HashMap<> ();
104
103
105
104
public TreeNode buildTree (int [] preorder , int [] inorder ) {
106
105
int n = preorder. length;
107
106
this . preorder = preorder;
108
- this . inorder = inorder;
109
107
for (int i = 0 ; i < n; ++ i) {
110
108
d. put(inorder[i], i);
111
109
}
@@ -337,43 +335,36 @@ class Solution:
337
335
```
338
336
339
337
``` java
340
- /**
341
- * Definition for a binary tree node.
342
- * public class TreeNode {
343
- * int val;
344
- * TreeNode left;
345
- * TreeNode right;
346
- * TreeNode() {}
347
- * TreeNode(int val) { this.val = val; }
348
- * TreeNode(int val, TreeNode left, TreeNode right) {
349
- * this.val = val;
350
- * this.left = left;
351
- * this.right = right;
352
- * }
353
- * }
354
- */
355
338
class Solution {
356
- private int [] preorder;
357
- private Map<Integer , Integer > d = new HashMap<> ();
339
+ private List< Integer > preorder;
340
+ private Map<Integer , List< Integer > > d = new HashMap<> ();
358
341
359
- public TreeNode buildTree ( int [] preorder , int [] inorder ) {
360
- int n = preorder . length ;
361
- this . preorder = preorder ;
342
+ public List< TreeNode > getBinaryTrees ( List< Integer > preOrder , List< Integer > inOrder ) {
343
+ int n = preOrder . size() ;
344
+ this . preorder = preOrder ;
362
345
for (int i = 0 ; i < n; ++ i) {
363
- d. put(inorder[i], i);
346
+ d. computeIfAbsent(inOrder . get(i), k - > new ArrayList<> ()) . add( i);
364
347
}
365
348
return dfs(0 , 0 , n);
366
349
}
367
350
368
- private TreeNode dfs (int i , int j , int n ) {
351
+ private List<TreeNode > dfs (int i , int j , int n ) {
352
+ List<TreeNode > ans = new ArrayList<> ();
369
353
if (n <= 0 ) {
370
- return null ;
354
+ ans. add(null );
355
+ return ans;
371
356
}
372
- int v = preorder[i];
373
- int k = d. get(v);
374
- TreeNode l = dfs(i + 1 , j, k - j);
375
- TreeNode r = dfs(i + 1 + k - j, k + 1 , n - 1 - (k - j));
376
- return new TreeNode (v, l, r);
357
+ int v = preorder. get(i);
358
+ for (int k : d. get(v)) {
359
+ if (k >= j && k < j + n) {
360
+ for (TreeNode l : dfs(i + 1 , j, k - j)) {
361
+ for (TreeNode r : dfs(i + 1 + k - j, k + 1 , n - 1 - (k - j))) {
362
+ ans. add(new TreeNode (v, l, r));
363
+ }
364
+ }
365
+ }
366
+ }
367
+ return ans;
377
368
}
378
369
}
379
370
```
0 commit comments