Skip to content

Commit 2acc23e

Browse files
committed
feat: update leetcode and lcof solutions
1 parent b0d8006 commit 2acc23e

File tree

11 files changed

+134
-136
lines changed

11 files changed

+134
-136
lines changed

lcof/面试题07. 重建二叉树/README.md

+19-17
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,21 @@
4040
# self.right = None
4141

4242
class Solution:
43+
indexes = {}
4344
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
44-
def build(preorder, inorder, p1, p2, i1, i2):
45+
def build(preorder, inorder, p1, p2, i1, i2) -> TreeNode:
4546
if p1 > p2 or i1 > i2:
4647
return None
4748
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)
49+
pos = self.indexes[root_val]
50+
root = TreeNode(root_val)
51+
root.left = None if pos == i1 else build(preorder, inorder, p1 + 1, p1 - i1 + pos, i1, pos - 1)
52+
root.right = None if pos == i2 else build(preorder, inorder, p1 - i1 + pos + 1, p2, pos + 1, i2)
53+
return root
54+
n = len(inorder)
55+
for i in range(n):
56+
self.indexes[inorder[i]] = i
57+
return build(preorder, inorder, 0, n - 1, 0, n - 1)
5858
```
5959

6060
### **Java**
@@ -70,18 +70,20 @@ class Solution:
7070
* }
7171
*/
7272
class Solution {
73+
private Map<Integer, Integer> indexes = new HashMap<>();
74+
7375
public TreeNode buildTree(int[] preorder, int[] inorder) {
74-
return build(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
76+
int n = inorder.length;
77+
for (int i = 0; i < n; ++i) {
78+
indexes.put(inorder[i], i);
79+
}
80+
return build(preorder, inorder, 0, n - 1, 0, n - 1);
7581
}
7682

7783
private TreeNode build(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
7884
if (p1 > p2 || i1 > i2) return null;
7985
int rootVal = preorder[p1];
80-
int pos = i1;
81-
while (pos <= i2) {
82-
if (inorder[pos] == rootVal) break;
83-
++pos;
84-
}
86+
int pos = indexes.get(rootVal);
8587
TreeNode node = new TreeNode(rootVal);
8688
node.left = pos == i1 ? null : build(preorder, inorder, p1 + 1, pos - i1 + p1, i1, pos - 1);
8789
node.right = pos == i2 ? null : build(preorder, inorder, pos - i1 + p1 + 1, p2, pos + 1, i2);

lcof/面试题07. 重建二叉树/Solution.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@
88
* }
99
*/
1010
class Solution {
11+
private Map<Integer, Integer> indexes = new HashMap<>();
12+
1113
public TreeNode buildTree(int[] preorder, int[] inorder) {
12-
return build(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
14+
int n = inorder.length;
15+
for (int i = 0; i < n; ++i) {
16+
indexes.put(inorder[i], i);
17+
}
18+
return build(preorder, inorder, 0, n - 1, 0, n - 1);
1319
}
1420

1521
private TreeNode build(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
1622
if (p1 > p2 || i1 > i2) return null;
1723
int rootVal = preorder[p1];
18-
int pos = i1;
19-
while (pos <= i2) {
20-
if (inorder[pos] == rootVal) break;
21-
++pos;
22-
}
24+
int pos = indexes.get(rootVal);
2325
TreeNode node = new TreeNode(rootVal);
2426
node.left = pos == i1 ? null : build(preorder, inorder, p1 + 1, pos - i1 + p1, i1, pos - 1);
2527
node.right = pos == i2 ? null : build(preorder, inorder, pos - i1 + p1 + 1, p2, pos + 1, i2);

lcof/面试题07. 重建二叉树/Solution.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
# self.right = None
77

88
class Solution:
9+
indexes = {}
910
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
10-
def build(preorder, inorder, p1, p2, i1, i2):
11+
def build(preorder, inorder, p1, p2, i1, i2) -> TreeNode:
1112
if p1 > p2 or i1 > i2:
1213
return None
1314
root_val = preorder[p1]
14-
pos = i1
15-
while pos <= i2:
16-
if inorder[pos] == root_val:
17-
break
18-
pos += 1
19-
node = TreeNode(root_val)
20-
node.left = None if pos == i1 else build(preorder, inorder, p1 + 1, pos - i1 + p1, i1, pos - 1)
21-
node.right = None if pos == i2 else build(preorder, inorder, pos - i1 + p1 + 1, p2, pos + 1, i2)
22-
return node
23-
return build(preorder, inorder, 0, len(preorder) - 1, 0, len(inorder) - 1)
15+
pos = self.indexes[root_val]
16+
root = TreeNode(root_val)
17+
root.left = None if pos == i1 else build(preorder, inorder, p1 + 1, p1 - i1 + pos, i1, pos - 1)
18+
root.right = None if pos == i2 else build(preorder, inorder, p1 - i1 + pos + 1, p2, pos + 1, i2)
19+
return root
20+
n = len(inorder)
21+
for i in range(n):
22+
self.indexes[inorder[i]] = i
23+
return build(preorder, inorder, 0, n - 1, 0, n - 1)

solution/0100-0199/0105.Construct Binary Tree from Preorder and Inorder Traversal/README.md

+19-20
Original file line numberDiff line numberDiff line change
@@ -50,23 +50,23 @@
5050
# self.right = None
5151

5252
class Solution:
53+
indexes = {}
5354
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
5455
def build(preorder, inorder, p1, p2, i1, i2) -> TreeNode:
5556
if p1 > p2 or i1 > i2:
5657
return None
5758
root_val = preorder[p1]
58-
pos = -1
59-
for i in range(i1, i2 + 1):
60-
if inorder[i] == root_val:
61-
pos = i
62-
break
59+
pos = self.indexes[root_val]
6360
root = TreeNode(root_val)
6461
# pos==i1,说明只有右子树,左子树为空
6562
root.left = None if pos == i1 else build(preorder, inorder, p1 + 1, p1 - i1 + pos, i1, pos - 1)
6663
# pos==i2,说明只有左子树,右子树为空
6764
root.right = None if pos == i2 else build(preorder, inorder, p1 - i1 + pos + 1, p2, pos + 1, i2)
6865
return root
69-
return build(preorder, inorder, 0, len(preorder) - 1, 0, len(inorder) - 1)
66+
n = len(inorder)
67+
for i in range(n):
68+
self.indexes[inorder[i]] = i
69+
return build(preorder, inorder, 0, n - 1, 0, n - 1)
7070
```
7171

7272
### **Java**
@@ -84,27 +84,26 @@ class Solution:
8484
* }
8585
*/
8686
class Solution {
87+
private Map<Integer, Integer> indexes = new HashMap<>();
88+
8789
public TreeNode buildTree(int[] preorder, int[] inorder) {
88-
return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
90+
int n = inorder.length;
91+
for (int i = 0; i < n; ++i) {
92+
indexes.put(inorder[i], i);
93+
}
94+
return build(preorder, inorder, 0, n - 1, 0, n - 1);
8995
}
9096

91-
private TreeNode buildTree(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
97+
private TreeNode build(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
9298
if (p1 > p2 || i1 > i2) return null;
9399
int rootVal = preorder[p1];
94-
int pos = find(inorder, rootVal, i1, i2);
95-
TreeNode root = new TreeNode(rootVal);
100+
int pos = indexes.get(rootVal);
101+
TreeNode node = new TreeNode(rootVal);
96102
// pos==i1,说明只有右子树,左子树为空
97-
root.left = pos == i1 ? null : buildTree(preorder, inorder, p1 + 1, p1 - i1 + pos, i1, pos - 1);
103+
node.left = pos == i1 ? null : build(preorder, inorder, p1 + 1, pos - i1 + p1, i1, pos - 1);
98104
// pos==i2,说明只有左子树,右子树为空
99-
root.right = pos == i2 ? null : buildTree(preorder, inorder, p1 - i1 + pos + 1, p2, pos + 1, i2);
100-
return root;
101-
}
102-
103-
private int find(int[] order, int val, int p, int q) {
104-
for (int i = p; i <= q; ++i) {
105-
if (order[i] == val) return i;
106-
}
107-
return -1;
105+
node.right = pos == i2 ? null : build(preorder, inorder, pos - i1 + p1 + 1, p2, pos + 1, i2);
106+
return node;
108107
}
109108
}
110109
```

solution/0100-0199/0105.Construct Binary Tree from Preorder and Inorder Traversal/README_EN.md

+19-20
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,21 @@ inorder = [9,3,15,20,7]</pre>
4747
# self.right = None
4848

4949
class Solution:
50+
indexes = {}
5051
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
5152
def build(preorder, inorder, p1, p2, i1, i2) -> TreeNode:
5253
if p1 > p2 or i1 > i2:
5354
return None
5455
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]
6057
root = TreeNode(root_val)
6158
root.left = None if pos == i1 else build(preorder, inorder, p1 + 1, p1 - i1 + pos, i1, pos - 1)
6259
root.right = None if pos == i2 else build(preorder, inorder, p1 - i1 + pos + 1, p2, pos + 1, i2)
6360
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)
6565
```
6666

6767
### **Java**
@@ -77,25 +77,24 @@ class Solution:
7777
* }
7878
*/
7979
class Solution {
80+
private Map<Integer, Integer> indexes = new HashMap<>();
81+
8082
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);
8288
}
8389

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) {
8591
if (p1 > p2 || i1 > i2) return null;
8692
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;
9998
}
10099
}
101100
```

solution/0100-0199/0105.Construct Binary Tree from Preorder and Inorder Traversal/Solution.java

+13-14
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,23 @@
88
* }
99
*/
1010
class Solution {
11+
private Map<Integer, Integer> indexes = new HashMap<>();
12+
1113
public TreeNode buildTree(int[] preorder, int[] inorder) {
12-
return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
14+
int n = inorder.length;
15+
for (int i = 0; i < n; ++i) {
16+
indexes.put(inorder[i], i);
17+
}
18+
return build(preorder, inorder, 0, n - 1, 0, n - 1);
1319
}
1420

15-
private TreeNode buildTree(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
21+
private TreeNode build(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
1622
if (p1 > p2 || i1 > i2) return null;
1723
int rootVal = preorder[p1];
18-
int pos = find(inorder, rootVal, i1, i2);
19-
TreeNode root = new TreeNode(rootVal);
20-
root.left = pos == i1 ? null : buildTree(preorder, inorder, p1 + 1, p1 - i1 + pos, i1, pos - 1);
21-
root.right = pos == i2 ? null : buildTree(preorder, inorder, p1 - i1 + pos + 1, p2, pos + 1, i2);
22-
return root;
23-
}
24-
25-
private int find(int[] order, int val, int p, int q) {
26-
for (int i = p; i <= q; ++i) {
27-
if (order[i] == val) return i;
28-
}
29-
return -1;
24+
int pos = indexes.get(rootVal);
25+
TreeNode node = new TreeNode(rootVal);
26+
node.left = pos == i1 ? null : build(preorder, inorder, p1 + 1, pos - i1 + p1, i1, pos - 1);
27+
node.right = pos == i2 ? null : build(preorder, inorder, pos - i1 + p1 + 1, p2, pos + 1, i2);
28+
return node;
3029
}
3130
}

solution/0100-0199/0105.Construct Binary Tree from Preorder and Inorder Traversal/Solution.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
# self.right = None
77

88
class Solution:
9+
indexes = {}
910
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
1011
def build(preorder, inorder, p1, p2, i1, i2) -> TreeNode:
1112
if p1 > p2 or i1 > i2:
1213
return None
1314
root_val = preorder[p1]
14-
pos = -1
15-
for i in range(i1, i2 + 1):
16-
if inorder[i] == root_val:
17-
pos = i
18-
break
15+
pos = self.indexes[root_val]
1916
root = TreeNode(root_val)
2017
root.left = None if pos == i1 else build(preorder, inorder, p1 + 1, p1 - i1 + pos, i1, pos - 1)
2118
root.right = None if pos == i2 else build(preorder, inorder, p1 - i1 + pos + 1, p2, pos + 1, i2)
2219
return root
23-
return build(preorder, inorder, 0, len(preorder) - 1, 0, len(inorder) - 1)
20+
n = len(inorder)
21+
for i in range(n):
22+
self.indexes[inorder[i]] = i
23+
return build(preorder, inorder, 0, n - 1, 0, n - 1)

solution/0100-0199/0106.Construct Binary Tree from Inorder and Postorder Traversal/README.md

+13-14
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,21 @@
4545
# self.right = None
4646

4747
class Solution:
48+
indexes = {}
4849
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
4950
def build(inorder, postorder, i1, i2, p1, p2):
5051
if i1 > i2 or p1 > p2:
5152
return None
5253
root_val = postorder[p2]
53-
pos = -1
54-
for i in range(i1, i2 + 1):
55-
if inorder[i] == root_val:
56-
pos = i
57-
break
54+
pos = self.indexes[root_val]
5855
root = TreeNode(root_val)
5956
root.left = None if pos == i1 else build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1)
6057
root.right = None if pos == i2 else build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1)
6158
return root
62-
return build(inorder, postorder, 0, len(inorder) - 1, 0, len(postorder) - 1)
59+
n = len(inorder)
60+
for i in range(n):
61+
self.indexes[inorder[i]] = i
62+
return build(inorder, postorder, 0, n - 1, 0, n - 1)
6363
```
6464

6565
### **Java**
@@ -77,26 +77,25 @@ class Solution:
7777
* }
7878
*/
7979
class Solution {
80+
private Map<Integer, Integer> indexes = new HashMap<>();
81+
8082
public TreeNode buildTree(int[] inorder, int[] postorder) {
83+
int n = inorder.length;
84+
for (int i = 0; i < n; ++i) {
85+
indexes.put(inorder[i], i);
86+
}
8187
return build(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);
8288
}
8389

8490
private TreeNode build(int[] inorder, int[] postorder, int i1, int i2, int p1, int p2) {
8591
if (i1 > i2 || p1 > p2) return null;
8692
int rootVal = postorder[p2];
87-
int pos = find(inorder, rootVal, i1, i2);
93+
int pos = indexes.get(rootVal);
8894
TreeNode root = new TreeNode(rootVal);
8995
root.left = pos == i1 ? null : build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1);
9096
root.right = pos == i2 ? null : build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1);
9197
return root;
9298
}
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;
99-
}
10099
}
101100
```
102101

0 commit comments

Comments
 (0)