Skip to content

Commit bae9138

Browse files
committed
feat(solution): add solution 0105 [Java]
Construct Binary Tree from Preorder and Inorder Traversal
1 parent 4b9ed2d commit bae9138

File tree

3 files changed

+72
-30
lines changed

3 files changed

+72
-30
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ Complete [solutions](https://github.com/doocs/leetcode/tree/master/solution) to
8787
| 0094 | [Binary Tree Inorder Traversal](https://github.com/doocs/leetcode/tree/master/solution/0094.Binary%20Tree%20Inorder%20Traversal) | `Hash Table`, `Stack`, `Tree` |
8888
| 0096 | [Unique Binary Search Trees](https://github.com/doocs/leetcode/tree/master/solution/0096.Unique%20Binary%20Search%20Trees) | `Tree`, `Dynamic Programming` |
8989
| 0102 | [Binary Tree Level Order Traversal](https://github.com/doocs/leetcode/tree/master/solution/0102.Binary%20Tree%20Level%20Order%20Traversal) | `Tree`, `Breadth-first Search` |
90+
| 0105 | [Construct Binary Tree from Preorder and Inorder Traversal](https://github.com/doocs/leetcode/tree/master/solution/0105.Construct%20Binary%20Tree%20from%20Preorder%20and%20Inorder%20Traversal) | `Array`, `Tree`, `Depth-first Search` |
9091
| 0127 | [Word Ladder](https://github.com/doocs/leetcode/tree/master/solution/0127.Word%20Ladder) | `Breadth-first Search` |
9192
| 0130 | [Surrounded Regions](https://github.com/doocs/leetcode/tree/master/solution/0130.Surrounded%20Regions) | `Depth-first Search`, `Breadth-first Search`, `Union Find` |
9293
| 0137 | [Single Number II](https://github.com/doocs/leetcode/tree/master/solution/0137.Single%20Number%20II) | `Bit Manipulation` |

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

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
### 问题描述
44
根据一棵树的前序遍历与中序遍历构造二叉树。
55

6-
注意:
6+
**注意:**
7+
78
你可以假设树中没有重复的元素。
89

910
例如,给出
@@ -20,46 +21,49 @@
2021
/ \
2122
15 7
2223
```
23-
---------------
2424

25-
### 思路
25+
### 解法
2626

27-
利用树的前序遍历和中序遍历特性+递归实现
27+
利用树的前序遍历和中序遍历特性 + 递归实现
2828

29-
对树进行前序遍历,每一个元素,在树的中序遍历中找到概元素;在中序遍历中,该元素的左边是它的左子树的全部元素,右边是它的右子树的全部元素,以此为递归条件,确定左右子树的范围
29+
对树进行前序遍历,每一个元素,在树的中序遍历中找到该元素;在中序遍历中,该元素的左边是它的左子树的全部元素,右边是它的右子树的全部元素,以此为递归条件,确定左右子树的范围
3030

31-
```CPP
31+
```java
3232
/**
3333
* Definition for a binary tree node.
34-
* struct TreeNode {
34+
* class TreeNode {
3535
* int val;
36-
* TreeNode *left;
37-
* TreeNode *right;
38-
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
39-
* };
36+
* TreeNode left;
37+
* TreeNode right;
38+
* TreeNode(int x) { val = x; }
39+
* }
4040
*/
4141
class Solution {
42-
public:
43-
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
44-
int pRight = preorder.size()-1;
45-
int iRight = inorder.size()-1;
46-
return build(preorder,inorder,0,pRight,0,iRight);
42+
public TreeNode buildTree(int[] preorder, int[] inorder) {
43+
if (preorder == null || inorder == null || preorder.length != inorder.length) {
44+
return null;
45+
}
46+
int n = preorder.length;
47+
return n > 0 ? buildTree(preorder, 0, n - 1, inorder, 0, n - 1) : null;
4748
}
4849

49-
50-
TreeNode* build(vector<int>& preorder,vector<int>& inorder,int pLeft,int pRight,int iLeft,int iRight){
51-
if(pLeft > pRight)return NULL;
52-
53-
TreeNode *node = new TreeNode(preorder[pLeft]);
54-
int idx = iLeft;
50+
private TreeNode buildTree(int[] preorder, int s1, int e1, int[] inorder, int s2, int e2) {
51+
TreeNode node = new TreeNode(preorder[s1]);
52+
if (s1 == e1 && s2 == e2) {
53+
return node;
54+
}
55+
56+
int p = s2;
57+
while (inorder[p] != preorder[s1]) {
58+
++p;
59+
if (p > e2) {
60+
throw new IllegalArgumentException("Invalid input!");
61+
}
62+
}
5563

56-
while(inorder[idx] != preorder[pLeft])idx++;
57-
node->left = build(preorder,inorder,pLeft+1,pLeft+idx-iLeft,iLeft,idx-1);
58-
node->right = build(preorder,inorder,pLeft+idx-iLeft+1,pRight,idx+1,iRight);
64+
node.left = p > s2 ? buildTree(preorder, s1 + 1, s1 - s2 + p, inorder, s2, p - 1) : null;
65+
node.right = p < e2 ? buildTree(preorder, s1 - s2 + p + 1, e1, inorder, p + 1, e2) : null;
5966
return node;
6067
}
61-
};
62-
63-
```
64-
65-
68+
}
69+
```
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* 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 || inorder == null || preorder.length != inorder.length) {
13+
return null;
14+
}
15+
int n = preorder.length;
16+
return n > 0 ? buildTree(preorder, 0, n - 1, inorder, 0, n - 1) : null;
17+
}
18+
19+
private TreeNode buildTree(int[] preorder, int s1, int e1, int[] inorder, int s2, int e2) {
20+
TreeNode node = new TreeNode(preorder[s1]);
21+
if (s1 == e1 && s2 == e2) {
22+
return node;
23+
}
24+
25+
int p = s2;
26+
while (inorder[p] != preorder[s1]) {
27+
++p;
28+
if (p > e2) {
29+
throw new IllegalArgumentException("Invalid input!");
30+
}
31+
}
32+
33+
node.left = p > s2 ? buildTree(preorder, s1 + 1, s1 - s2 + p, inorder, s2, p - 1) : null;
34+
node.right = p < e2 ? buildTree(preorder, s1 - s2 + p + 1, e1, inorder, p + 1, e2) : null;
35+
return node;
36+
}
37+
}

0 commit comments

Comments
 (0)