Skip to content

Commit b0d8006

Browse files
committed
feat: update solutions to lcof problem
1 parent 8a5fef7 commit b0d8006

File tree

4 files changed

+75
-80
lines changed

4 files changed

+75
-80
lines changed

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

+26-40
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,20 @@
4141

4242
class Solution:
4343
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)
6258
```
6359

6460
### **Java**
@@ -75,31 +71,21 @@ class Solution:
7571
*/
7672
class Solution {
7773
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);
9475
}
9576

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;
10184
}
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;
10389
}
10490
}
10591
```

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

+12-22
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,20 @@
99
*/
1010
class Solution {
1111
public TreeNode buildTree(int[] preorder, int[] inorder) {
12-
if (preorder == null || preorder == null || preorder.length == 0 || preorder.length == 0 || preorder.length != inorder.length) {
13-
return null;
14-
}
15-
16-
return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
17-
}
18-
19-
public TreeNode buildTree(int[] preorder, int s1, int e1, int[] inorder, int s2, int e2) {
20-
if (s1 > e1 || s2 > e2) {
21-
return null;
22-
}
23-
int index = findIndex(inorder, s2, e2, preorder[s1]);
24-
TreeNode tree = new TreeNode(preorder[s1]);
25-
tree.left = buildTree(preorder, s1 + 1, index + s1 - s2, inorder, s2, index - 1);
26-
tree.right = buildTree(preorder, index + s1 - s2 + 1, e1, inorder, index + 1, e2);
27-
return tree;
12+
return build(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
2813
}
2914

30-
public int findIndex(int[] order, int s, int e, int val) {
31-
for (int i = s; i <= e; ++i) {
32-
if (order[i] == val) {
33-
return i;
34-
}
15+
private TreeNode build(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
16+
if (p1 > p2 || i1 > i2) return null;
17+
int rootVal = preorder[p1];
18+
int pos = i1;
19+
while (pos <= i2) {
20+
if (inorder[pos] == rootVal) break;
21+
++pos;
3522
}
36-
return -1;
23+
TreeNode node = new TreeNode(rootVal);
24+
node.left = pos == i1 ? null : build(preorder, inorder, p1 + 1, pos - i1 + p1, i1, pos - 1);
25+
node.right = pos == i2 ? null : build(preorder, inorder, pos - i1 + p1 + 1, p2, pos + 1, i2);
26+
return node;
3727
}
3828
}

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

+14-18
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,17 @@
77

88
class Solution:
99
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
10-
if preorder is None or inorder is None or len(preorder) != len(inorder):
11-
return None
12-
return self._build_tree(preorder, 0, len(preorder) - 1, inorder, 0, len(inorder) - 1)
13-
14-
def _build_tree(self, preorder, s1, e1, inorder, s2, e2):
15-
if s1 > e1 or s2 > e2:
16-
return None
17-
index = self._find_index(inorder, s2, e2, preorder[s1])
18-
tree = TreeNode(preorder[s1])
19-
tree.left = self._build_tree(preorder, s1 + 1, index + s1 - s2, inorder, s2, index - 1)
20-
tree.right = self._build_tree(preorder, index + s1 - s2 + 1, e1, inorder, index + 1, e2)
21-
return tree
22-
23-
def _find_index(self, order, s, e, val):
24-
for i in range(s, e + 1):
25-
if order[i] == val:
26-
return i
27-
return -1
10+
def build(preorder, inorder, p1, p2, i1, i2):
11+
if p1 > p2 or i1 > i2:
12+
return None
13+
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)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution:
9+
def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
10+
res = []
11+
q = deque()
12+
q.append((root, [], 0))
13+
while q:
14+
node, path, s = q.popleft()
15+
if node is None:
16+
continue
17+
if node.left is None and node.right is None:
18+
if s + node.val == sum:
19+
res.append(path + [node.val])
20+
continue
21+
q.append((node.left, path + [node.val], s + node.val))
22+
q.append((node.right, path + [node.val], s + node.val))
23+
return res

0 commit comments

Comments
 (0)