@@ -47,21 +47,21 @@ inorder = [9,3,15,20,7]</pre>
47
47
# self.right = None
48
48
49
49
class Solution :
50
+ indexes = {}
50
51
def buildTree (self , preorder : List[int ], inorder : List[int ]) -> TreeNode:
51
52
def build (preorder , inorder , p1 , p2 , i1 , i2 ) -> TreeNode:
52
53
if p1 > p2 or i1 > i2:
53
54
return None
54
55
root_val = preorder[p1]
55
- pos = - 1
56
- for i in range (i1, i2 + 1 ):
57
- if inorder[i] == root_val:
58
- pos = i
59
- break
56
+ pos = self .indexes[root_val]
60
57
root = TreeNode(root_val)
61
58
root.left = None if pos == i1 else build(preorder, inorder, p1 + 1 , p1 - i1 + pos, i1, pos - 1 )
62
59
root.right = None if pos == i2 else build(preorder, inorder, p1 - i1 + pos + 1 , p2, pos + 1 , i2)
63
60
return root
64
- return build(preorder, inorder, 0 , len (preorder) - 1 , 0 , len (inorder) - 1 )
61
+ n = len (inorder)
62
+ for i in range (n):
63
+ self .indexes[inorder[i]] = i
64
+ return build(preorder, inorder, 0 , n - 1 , 0 , n - 1 )
65
65
```
66
66
67
67
### ** Java**
@@ -77,25 +77,24 @@ class Solution:
77
77
* }
78
78
*/
79
79
class Solution {
80
+ private Map<Integer , Integer > indexes = new HashMap<> ();
81
+
80
82
public TreeNode buildTree (int [] preorder , int [] inorder ) {
81
- return buildTree(preorder, inorder, 0 , preorder. length - 1 , 0 , inorder. length - 1 );
83
+ int n = inorder. length;
84
+ for (int i = 0 ; i < n; ++ i) {
85
+ indexes. put(inorder[i], i);
86
+ }
87
+ return build(preorder, inorder, 0 , n - 1 , 0 , n - 1 );
82
88
}
83
89
84
- private TreeNode buildTree (int [] preorder , int [] inorder , int p1 , int p2 , int i1 , int i2 ) {
90
+ private TreeNode build (int [] preorder , int [] inorder , int p1 , int p2 , int i1 , int i2 ) {
85
91
if (p1 > p2 || i1 > i2) return null ;
86
92
int rootVal = preorder[p1];
87
- int pos = find(inorder, rootVal, i1, i2);
88
- TreeNode root = new TreeNode (rootVal);
89
- root. left = pos == i1 ? null : buildTree(preorder, inorder, p1 + 1 , p1 - i1 + pos, i1, pos - 1 );
90
- root. right = pos == i2 ? null : buildTree(preorder, inorder, p1 - i1 + pos + 1 , p2, pos + 1 , i2);
91
- return root;
92
- }
93
-
94
- private int find (int [] order , int val , int p , int q ) {
95
- for (int i = p; i <= q; ++ i) {
96
- if (order[i] == val) return i;
97
- }
98
- return - 1 ;
93
+ int pos = indexes. get(rootVal);
94
+ TreeNode node = new TreeNode (rootVal);
95
+ node. left = pos == i1 ? null : build(preorder, inorder, p1 + 1 , pos - i1 + p1, i1, pos - 1 );
96
+ node. right = pos == i2 ? null : build(preorder, inorder, pos - i1 + p1 + 1 , p2, pos + 1 , i2);
97
+ return node;
99
98
}
100
99
}
101
100
```
0 commit comments