41
41
42
42
class Solution :
43
43
def buildTree (self , preorder : List[int ], inorder : List[int ]) -> TreeNode:
44
- if preorder is None or inorder is None or len (preorder) != len (inorder):
45
- return None
46
- return self ._build_tree(preorder, 0 , len (preorder) - 1 , inorder, 0 , len (inorder) - 1 )
47
-
48
- def _build_tree (self , preorder , s1 , e1 , inorder , s2 , e2 ):
49
- if s1 > e1 or s2 > e2:
50
- return None
51
- index = self ._find_index(inorder, s2, e2, preorder[s1])
52
- tree = TreeNode(preorder[s1])
53
- tree.left = self ._build_tree(preorder, s1 + 1 , index + s1 - s2, inorder, s2, index - 1 )
54
- tree.right = self ._build_tree(preorder, index + s1 - s2 + 1 , e1, inorder, index + 1 , e2)
55
- return tree
56
-
57
- def _find_index (self , order , s , e , val ):
58
- for i in range (s, e + 1 ):
59
- if order[i] == val:
60
- return i
61
- return - 1
44
+ def build (preorder , inorder , p1 , p2 , i1 , i2 ):
45
+ if p1 > p2 or i1 > i2:
46
+ return None
47
+ root_val = preorder[p1]
48
+ pos = i1
49
+ while pos <= i2:
50
+ if inorder[pos] == root_val:
51
+ break
52
+ pos += 1
53
+ node = TreeNode(root_val)
54
+ node.left = None if pos == i1 else build(preorder, inorder, p1 + 1 , pos - i1 + p1, i1, pos - 1 )
55
+ node.right = None if pos == i2 else build(preorder, inorder, pos - i1 + p1 + 1 , p2, pos + 1 , i2)
56
+ return node
57
+ return build(preorder, inorder, 0 , len (preorder) - 1 , 0 , len (inorder) - 1 )
62
58
```
63
59
64
60
### ** Java**
@@ -75,31 +71,21 @@ class Solution:
75
71
*/
76
72
class Solution {
77
73
public TreeNode buildTree (int [] preorder , int [] inorder ) {
78
- if (preorder == null || preorder == null || preorder. length == 0 || preorder. length == 0 || preorder. length != inorder. length) {
79
- return null ;
80
- }
81
-
82
- return buildTree(preorder, 0 , preorder. length - 1 , inorder, 0 , inorder. length - 1 );
83
- }
84
-
85
- public TreeNode buildTree (int [] preorder , int s1 , int e1 , int [] inorder , int s2 , int e2 ) {
86
- if (s1 > e1 || s2 > e2) {
87
- return null ;
88
- }
89
- int index = findIndex(inorder, s2, e2, preorder[s1]);
90
- TreeNode tree = new TreeNode (preorder[s1]);
91
- tree. left = buildTree(preorder, s1 + 1 , index + s1 - s2, inorder, s2, index - 1 );
92
- tree. right = buildTree(preorder, index + s1 - s2 + 1 , e1, inorder, index + 1 , e2);
93
- return tree;
74
+ return build(preorder, inorder, 0 , preorder. length - 1 , 0 , inorder. length - 1 );
94
75
}
95
76
96
- public int findIndex (int [] order , int s , int e , int val ) {
97
- for (int i = s; i <= e; ++ i) {
98
- if (order[i] == val) {
99
- return i;
100
- }
77
+ private TreeNode build (int [] preorder , int [] inorder , int p1 , int p2 , int i1 , int i2 ) {
78
+ if (p1 > p2 || i1 > i2) return null ;
79
+ int rootVal = preorder[p1];
80
+ int pos = i1;
81
+ while (pos <= i2) {
82
+ if (inorder[pos] == rootVal) break ;
83
+ ++ pos;
101
84
}
102
- return - 1 ;
85
+ TreeNode node = new TreeNode (rootVal);
86
+ node. left = pos == i1 ? null : build(preorder, inorder, p1 + 1 , pos - i1 + p1, i1, pos - 1 );
87
+ node. right = pos == i2 ? null : build(preorder, inorder, pos - i1 + p1 + 1 , p2, pos + 1 , i2);
88
+ return node;
103
89
}
104
90
}
105
91
```
0 commit comments