Skip to content

Commit da05a0d

Browse files
committed
feat: add python and java solution to lcof problem
1 parent e324b5a commit da05a0d

File tree

3 files changed

+171
-0
lines changed

3 files changed

+171
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# [面试题07. 重建二叉树](https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/)
2+
3+
## 题目描述
4+
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
5+
6+
 
7+
8+
例如,给出
9+
10+
```
11+
前序遍历 preorder = [3,9,20,15,7]
12+
中序遍历 inorder = [9,3,15,20,7]
13+
```
14+
15+
返回如下的二叉树:
16+
17+
```
18+
3
19+
/ \
20+
9 20
21+
/ \
22+
15 7
23+
``` 
24+
25+
**限制:**
26+
27+
- `0 <= 节点个数 <= 5000`
28+
29+
## 解法
30+
### Python3
31+
```python
32+
# Definition for a binary tree node.
33+
# class TreeNode:
34+
# def __init__(self, x):
35+
# self.val = x
36+
# self.left = None
37+
# self.right = None
38+
39+
class Solution:
40+
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
41+
if preorder is None or inorder is None or len(preorder) != len(inorder):
42+
return None
43+
return self._build_tree(preorder, 0, len(preorder) - 1, inorder, 0, len(inorder) - 1)
44+
45+
def _build_tree(self, preorder, s1, e1, inorder, s2, e2):
46+
if s1 > e1 or s2 > e2:
47+
return None
48+
index = self._find_index(inorder, s2, e2, preorder[s1])
49+
tree = TreeNode(preorder[s1])
50+
tree.left = self._build_tree(preorder, s1 + 1, index + s1 - s2, inorder, s2, index - 1)
51+
tree.right = self._build_tree(preorder, index + s1 - s2 + 1, e1, inorder, index + 1, e2)
52+
return tree
53+
54+
def _find_index(self, order, s, e, val):
55+
for i in range(s, e + 1):
56+
if order[i] == val:
57+
return i
58+
return -1
59+
```
60+
61+
### Java
62+
```java
63+
/**
64+
* Definition for a binary tree node.
65+
* public class TreeNode {
66+
* int val;
67+
* TreeNode left;
68+
* TreeNode right;
69+
* TreeNode(int x) { val = x; }
70+
* }
71+
*/
72+
class Solution {
73+
public TreeNode buildTree(int[] preorder, int[] inorder) {
74+
if (preorder == null || preorder == null || preorder.length == 0 || preorder.length == 0 || preorder.length != inorder.length) {
75+
return null;
76+
}
77+
78+
return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
79+
}
80+
81+
public TreeNode buildTree(int[] preorder, int s1, int e1, int[] inorder, int s2, int e2) {
82+
if (s1 > e1 || s2 > e2) {
83+
return null;
84+
}
85+
int index = findIndex(inorder, s2, e2, preorder[s1]);
86+
TreeNode tree = new TreeNode(preorder[s1]);
87+
tree.left = buildTree(preorder, s1 + 1, index + s1 - s2, inorder, s2, index - 1);
88+
tree.right = buildTree(preorder, index + s1 - s2 + 1, e1, inorder, index + 1, e2);
89+
return tree;
90+
}
91+
92+
public int findIndex(int[] order, int s, int e, int val) {
93+
for (int i = s; i <= e; ++i) {
94+
if (order[i] == val) {
95+
return i;
96+
}
97+
}
98+
return -1;
99+
}
100+
}
101+
```
102+
103+
### ...
104+
```
105+
106+
```
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode(int x) { val = x; }
8+
* }
9+
*/
10+
class Solution {
11+
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;
28+
}
29+
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+
}
35+
}
36+
return -1;
37+
}
38+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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 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

0 commit comments

Comments
 (0)