Skip to content

Commit 1f35106

Browse files
committedDec 21, 2020
1 parent a2c46d6 commit 1f35106

File tree

9 files changed

+201
-37
lines changed

9 files changed

+201
-37
lines changed
 

‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
1. [二叉树的层次遍历](/solution/0100-0199/0102.Binary%20Tree%20Level%20Order%20Traversal/README.md)
8888
1. [二叉树的最大深度](/solution/0100-0199/0104.Maximum%20Depth%20of%20Binary%20Tree/README.md)
8989
1. [从前序与中序遍历序列构造二叉树](/solution/0100-0199/0105.Construct%20Binary%20Tree%20from%20Preorder%20and%20Inorder%20Traversal/README.md)
90+
1. [从中序与后序遍历序列构造二叉树](/solution/0100-0199/0106.Construct%20Binary%20Tree%20from%20Inorder%20and%20Postorder%20Traversal/README.md)
9091
1. [二叉树的最近公共祖先](/solution/0200-0299/0235.Lowest%20Common%20Ancestor%20of%20a%20Binary%20Search%20Tree/README.md)
9192
1. [二叉搜索树的最近公共祖先](/solution/0200-0299/0236.Lowest%20Common%20Ancestor%20of%20a%20Binary%20Tree/README.md)
9293

‎README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ Complete solutions to [LeetCode](https://leetcode-cn.com/problemset/all/), [LCOF
8585
1. [Binary Tree Level Order Traversal](/solution/0100-0199/0102.Binary%20Tree%20Level%20Order%20Traversal/README_EN.md)
8686
1. [Maximum Depth of Binary Tree](/solution/0100-0199/0104.Maximum%20Depth%20of%20Binary%20Tree/README_EN.md)
8787
1. [Construct Binary Tree from Preorder and Inorder Traversal](/solution/0100-0199/0105.Construct%20Binary%20Tree%20from%20Preorder%20and%20Inorder%20Traversal/README_EN.md)
88+
1. [Construct Binary Tree from Inorder and Postorder Traversal](/solution/0100-0199/0106.Construct%20Binary%20Tree%20from%20Inorder%20and%20Postorder%20Traversal/README_EN.md)
8889
1. [Lowest Common Ancestor of a Binary Tree](/solution/0200-0299/0236.Lowest%20Common%20Ancestor%20of%20a%20Binary%20Tree/README_EN.md)
8990
1. [Lowest Common Ancestor of a Binary Search Tree](/solution/0200-0299/0235.Lowest%20Common%20Ancestor%20of%20a%20Binary%20Search%20Tree/README_EN.md)
9091

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,7 @@ class Solution {
8989
}
9090

9191
private TreeNode buildTree(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
92-
if (p1 > p2 || i1 > i2) {
93-
return null;
94-
}
92+
if (p1 > p2 || i1 > i2) return null;
9593
int rootVal = preorder[p1];
9694
int pos = find(inorder, rootVal, i1, i2);
9795
TreeNode root = new TreeNode(rootVal);
@@ -106,7 +104,7 @@ class Solution {
106104
for (int i = p; i <= q; ++i) {
107105
if (order[i] == val) return i;
108106
}
109-
return 0;
107+
return -1;
110108
}
111109
}
112110
```

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ class Solution {
8282
}
8383

8484
private TreeNode buildTree(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
85-
if (p1 > p2 || i1 > i2) {
86-
return null;
87-
}
85+
if (p1 > p2 || i1 > i2) return null;
8886
int rootVal = preorder[p1];
8987
int pos = find(inorder, rootVal, i1, i2);
9088
TreeNode root = new TreeNode(rootVal);
@@ -97,7 +95,7 @@ class Solution {
9795
for (int i = p; i <= q; ++i) {
9896
if (order[i] == val) return i;
9997
}
100-
return 0;
98+
return -1;
10199
}
102100
}
103101
```

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ public TreeNode buildTree(int[] preorder, int[] inorder) {
1313
}
1414

1515
private TreeNode buildTree(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
16-
if (p1 > p2 || i1 > i2) {
17-
return null;
18-
}
16+
if (p1 > p2 || i1 > i2) return null;
1917
int rootVal = preorder[p1];
2018
int pos = find(inorder, rootVal, i1, i2);
2119
TreeNode root = new TreeNode(rootVal);
@@ -28,6 +26,6 @@ private int find(int[] order, int val, int p, int q) {
2826
for (int i = p; i <= q; ++i) {
2927
if (order[i] == val) return i;
3028
}
31-
return 0;
29+
return -1;
3230
}
3331
}

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

+78-1
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,99 @@
2828

2929
<!-- 这里可写通用的实现逻辑 -->
3030

31+
思路同 [105](/solution/0100-0199/0105.Construct%20Binary%20Tree%20from%20Preorder%20and%20Inorder%20Traversal/README.md)
32+
3133
<!-- tabs:start -->
3234

3335
### **Python3**
3436

3537
<!-- 这里可写当前语言的特殊实现逻辑 -->
3638

3739
```python
38-
40+
# Definition for a binary tree node.
41+
# class TreeNode:
42+
# def __init__(self, x):
43+
# self.val = x
44+
# self.left = None
45+
# self.right = None
46+
47+
class Solution:
48+
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
49+
def build(inorder, postorder, i1, i2, p1, p2):
50+
if i1 > i2 or p1 > p2:
51+
return None
52+
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
58+
root = TreeNode(root_val)
59+
root.left = None if pos == i1 else build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1)
60+
root.right = None if pos == i2 else build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1)
61+
return root
62+
return build(inorder, postorder, 0, len(inorder) - 1, 0, len(postorder) - 1)
3963
```
4064

4165
### **Java**
4266

4367
<!-- 这里可写当前语言的特殊实现逻辑 -->
4468

4569
```java
70+
/**
71+
* Definition for a binary tree node.
72+
* public class TreeNode {
73+
* int val;
74+
* TreeNode left;
75+
* TreeNode right;
76+
* TreeNode(int x) { val = x; }
77+
* }
78+
*/
79+
class Solution {
80+
public TreeNode buildTree(int[] inorder, int[] postorder) {
81+
return build(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);
82+
}
83+
84+
private TreeNode build(int[] inorder, int[] postorder, int i1, int i2, int p1, int p2) {
85+
if (i1 > i2 || p1 > p2) return null;
86+
int rootVal = postorder[p2];
87+
int pos = find(inorder, rootVal, i1, i2);
88+
TreeNode root = new TreeNode(rootVal);
89+
root.left = pos == i1 ? null : build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1);
90+
root.right = pos == i2 ? null : build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1);
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;
99+
}
100+
}
101+
```
46102

103+
### **C++**
104+
105+
```cpp
106+
class Solution {
107+
public:
108+
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
109+
return buildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
110+
}
111+
TreeNode *buildTree(vector<int> &inorder, int iLeft, int iRight, vector<int> &postorder, int pLeft, int pRight) {
112+
if (iLeft > iRight || pLeft > pRight) return NULL;
113+
TreeNode *cur = new TreeNode(postorder[pRight]);
114+
int i = 0;
115+
for (i = iLeft; i < inorder.size(); ++i) {
116+
if (inorder[i] == cur->val)
117+
break;
118+
}
119+
cur->left = buildTree(inorder, iLeft, i - 1, postorder, pLeft, pLeft + i - iLeft - 1);
120+
cur->right = buildTree(inorder, i + 1, iRight, postorder, pLeft + i - iLeft, pRight - 1);
121+
return cur;
122+
}
123+
};
47124
```
48125
49126
### **...**

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

+76-1
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,88 @@ postorder = [9,15,7,20,3]</pre>
4141
### **Python3**
4242

4343
```python
44-
44+
# Definition for a binary tree node.
45+
# class TreeNode:
46+
# def __init__(self, x):
47+
# self.val = x
48+
# self.left = None
49+
# self.right = None
50+
51+
class Solution:
52+
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
53+
def build(inorder, postorder, i1, i2, p1, p2):
54+
if i1 > i2 or p1 > p2:
55+
return None
56+
root_val = postorder[p2]
57+
pos = -1
58+
for i in range(i1, i2 + 1):
59+
if inorder[i] == root_val:
60+
pos = i
61+
break
62+
root = TreeNode(root_val)
63+
root.left = None if pos == i1 else build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1)
64+
root.right = None if pos == i2 else build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1)
65+
return root
66+
return build(inorder, postorder, 0, len(inorder) - 1, 0, len(postorder) - 1)
4567
```
4668

4769
### **Java**
4870

4971
```java
72+
/**
73+
* Definition for a binary tree node.
74+
* public class TreeNode {
75+
* int val;
76+
* TreeNode left;
77+
* TreeNode right;
78+
* TreeNode(int x) { val = x; }
79+
* }
80+
*/
81+
class Solution {
82+
public TreeNode buildTree(int[] inorder, int[] postorder) {
83+
return build(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);
84+
}
85+
86+
private TreeNode build(int[] inorder, int[] postorder, int i1, int i2, int p1, int p2) {
87+
if (i1 > i2 || p1 > p2) return null;
88+
int rootVal = postorder[p2];
89+
int pos = find(inorder, rootVal, i1, i2);
90+
TreeNode root = new TreeNode(rootVal);
91+
root.left = pos == i1 ? null : build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1);
92+
root.right = pos == i2 ? null : build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1);
93+
return root;
94+
}
95+
96+
private int find(int[] order, int val, int p, int q) {
97+
for (int i = p; i <= q; ++i) {
98+
if (order[i] == val) return i;
99+
}
100+
return -1;
101+
}
102+
}
103+
```
50104

105+
### **C++**
106+
107+
```cpp
108+
class Solution {
109+
public:
110+
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
111+
return buildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
112+
}
113+
TreeNode *buildTree(vector<int> &inorder, int iLeft, int iRight, vector<int> &postorder, int pLeft, int pRight) {
114+
if (iLeft > iRight || pLeft > pRight) return NULL;
115+
TreeNode *cur = new TreeNode(postorder[pRight]);
116+
int i = 0;
117+
for (i = iLeft; i < inorder.size(); ++i) {
118+
if (inorder[i] == cur->val)
119+
break;
120+
}
121+
cur->left = buildTree(inorder, iLeft, i - 1, postorder, pLeft, pLeft + i - iLeft - 1);
122+
cur->right = buildTree(inorder, i + 1, iRight, postorder, pLeft + i - iLeft, pRight - 1);
123+
return cur;
124+
}
125+
};
51126
```
52127
53128
### **...**

‎solution/0100-0199/0106.Construct Binary Tree from Inorder and Postorder Traversal/Solution.java

+16-23
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,23 @@
99
*/
1010
class Solution {
1111
public TreeNode buildTree(int[] inorder, int[] postorder) {
12-
if (inorder == null || postorder == null || inorder.length != postorder.length) {
13-
return null;
14-
}
15-
int n = inorder.length;
16-
return n > 0 ? buildTree(inorder, 0, n - 1, postorder, 0, n - 1) : null;
12+
return build(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);
1713
}
18-
19-
private TreeNode buildTree(int[] inorder, int s1, int e1, int[] postorder, int s2, int e2) {
20-
TreeNode node = new TreeNode(postorder[e2]);
21-
if (s2 == e2 && s1 == e1) {
22-
return node;
23-
}
24-
25-
int p = s1;
26-
while (inorder[p] != postorder[e2]) {
27-
++p;
28-
if (p > e1) {
29-
throw new IllegalArgumentException("Invalid input!");
30-
}
14+
15+
private TreeNode build(int[] inorder, int[] postorder, int i1, int i2, int p1, int p2) {
16+
if (i1 > i2 || p1 > p2) return null;
17+
int rootVal = postorder[p2];
18+
int pos = find(inorder, rootVal, i1, i2);
19+
TreeNode root = new TreeNode(rootVal);
20+
root.left = pos == i1 ? null : build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1);
21+
root.right = pos == i2 ? null : build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1);
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;
3128
}
32-
33-
node.left = p > s1 ? buildTree(inorder, s1, p - 1, postorder, s2, p - 1 + s2 - s1) : null;
34-
node.right = p < e1 ? buildTree(inorder, p + 1, e1, postorder, p + s2 - s1, e2 - 1) : null;
35-
return node;
36-
29+
return -1;
3730
}
3831
}
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 buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
10+
def build(inorder, postorder, i1, i2, p1, p2):
11+
if i1 > i2 or p1 > p2:
12+
return None
13+
root_val = postorder[p2]
14+
pos = -1
15+
for i in range(i1, i2 + 1):
16+
if inorder[i] == root_val:
17+
pos = i
18+
break
19+
root = TreeNode(root_val)
20+
root.left = None if pos == i1 else build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1)
21+
root.right = None if pos == i2 else build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1)
22+
return root
23+
return build(inorder, postorder, 0, len(inorder) - 1, 0, len(postorder) - 1)

0 commit comments

Comments
 (0)
Please sign in to comment.