Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 8f8dd00

Browse files
committed
feat: update solutions to lcof problem: No.33
剑指 Offer 33. 二叉搜索树的后序遍历序列
1 parent e962d61 commit 8f8dd00

File tree

7 files changed

+150
-164
lines changed

7 files changed

+150
-164
lines changed

‎README_EN.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
221221
- [Design HashSet](/solution/0700-0799/0705.Design%20HashSet/README_EN.md)
222222
- [Design HashMap](/solution/0700-0799/0706.Design%20HashMap/README_EN.md)
223223

224-
## Maintainer
224+
## Maintainers
225225

226226
- [Yang Libin](https://github.com/yanglbme)
227227
- [Mao Longlong](https://github.com/MaoLongLong)

‎lcof/面试题33. 二叉搜索树的后序遍历序列/README.md‎

Lines changed: 74 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,18 @@
4949
```python
5050
class Solution:
5151
def verifyPostorder(self, postorder: List[int]) -> bool:
52-
def verify(p1, p2):
53-
if p1 > p2:
52+
def dfs(postorder):
53+
if not postorder:
5454
return True
55-
pos = p1
56-
while pos < p2 and postorder[pos] < postorder[p2]:
57-
pos += 1
58-
p = pos
59-
while pos < p2:
60-
if postorder[pos] < postorder[p2]:
61-
return False
62-
pos += 1
63-
return verify(p1, p - 1) and verify(p, p2 - 1)
64-
if not postorder:
65-
return True
66-
return verify(0, len(postorder) - 1)
55+
v = postorder[-1]
56+
i = 0
57+
while i < len(postorder) and postorder[i] < v:
58+
i += 1
59+
if any(x < v for x in postorder[i:]):
60+
return False
61+
return dfs(postorder[:i]) and dfs(postorder[i:-1])
62+
63+
return dfs(postorder)
6764
```
6865

6966
### **Java**
@@ -73,21 +70,27 @@ class Solution:
7370
```java
7471
class Solution {
7572
public boolean verifyPostorder(int[] postorder) {
76-
int n;
77-
if (postorder == null || (n = postorder.length) == 0) return true;
78-
return verify(postorder, 0, n - 1);
73+
if (postorder == null || postorder.length < 2) {
74+
return true;
75+
}
76+
return dfs(postorder, 0, postorder.length);
7977
}
8078

81-
private boolean verify(int[] postorder, int p1, int p2) {
82-
if (p1 >= p2) return true;
83-
int pos = p1;
84-
while (pos < p2 && postorder[pos] < postorder[p2]) ++pos;
85-
int p = pos;
86-
while (pos < p2) {
87-
if (postorder[pos] < postorder[p2]) return false;
88-
++pos;
79+
private boolean dfs(int[] postorder, int i, int n) {
80+
if (n <= 0) {
81+
return true;
82+
}
83+
int v = postorder[i + n - 1];
84+
int j = i;
85+
while (j < i + n && postorder[j] < v) {
86+
++j;
87+
}
88+
for (int k = j; k < i + n; ++k) {
89+
if (postorder[k] < v) {
90+
return false;
91+
}
8992
}
90-
return verify(postorder, p1, p - 1) && verify(postorder, p, p2 - 1);
93+
return dfs(postorder, i, j - i) && dfs(postorder, j, n + i - j - 1);
9194
}
9295
}
9396
```
@@ -100,52 +103,48 @@ class Solution {
100103
* @return {boolean}
101104
*/
102105
var verifyPostorder = function (postorder) {
103-
if (!postorder || postorder.length < 2) return true;
104-
let mid = 0;
105-
let root = postorder[postorder.length - 1];
106-
for (let i = 0; i < postorder.length - 1 && postorder[i] < root; i++) {
107-
mid++;
108-
}
109-
for (let i = mid + 1; i < postorder.length - 1; i++) {
110-
if (postorder[i] < root) return false;
106+
if (postorder.length < 2) return true;
107+
function dfs(i, n) {
108+
if (n <= 0) return true;
109+
const v = postorder[i + n - 1];
110+
let j = i;
111+
while (j < i + n && postorder[j] < v) ++j;
112+
for (let k = j; k < i + n; ++k) {
113+
if (postorder[k] < v) {
114+
return false;
115+
}
116+
}
117+
return dfs(i, j - i) && dfs(j, n + i - j - 1);
111118
}
112-
return (
113-
verifyPostorder(postorder.slice(0, mid)) &&
114-
verifyPostorder(postorder.slice(mid + 1, postorder.length - 1))
115-
);
119+
return dfs(0, postorder.length);
116120
};
117121
```
118122

119123
### **Go**
120124

121125
```go
122126
func verifyPostorder(postorder []int) bool {
123-
if len(postorder) < 2 {
124-
return true
125-
}
126-
return helper(postorder, 0, len(postorder)-1)
127-
}
128-
// 递归
129-
func helper(postorder []int , left,right int) bool {
130-
if left >= right {
131-
return true
132-
}
133-
// 最后一位即根
134-
rootValue := postorder[right]
135-
// 从左开始往右遍历,直到大于根停止,小于部分是左子树
136-
i := left
137-
for i < right && postorder[i] < rootValue {
138-
i++
139-
}
140-
// 剩下部分是右子树,检查是否都大于根值
141-
for j := i; j < right; j++ {
142-
if postorder[j] < rootValue {
143-
return false
144-
}
145-
}
146-
l := helper(postorder,left,i-1) // 检查左子树,左子树i要减一
147-
r := helper(postorder,i,right-1)// 检查右子树,剔除最后一位是根
148-
return l && r
127+
if len(postorder) < 2 {
128+
return true
129+
}
130+
var dfs func(i, n int) bool
131+
dfs = func(i, n int) bool {
132+
if n <= 0 {
133+
return true
134+
}
135+
v := postorder[i+n-1]
136+
j := i
137+
for j < i+n && postorder[j] < v {
138+
j++
139+
}
140+
for k := j; k < i+n; k++ {
141+
if postorder[k] < v {
142+
return false
143+
}
144+
}
145+
return dfs(i, j-i) && dfs(j, n+i-j-1)
146+
}
147+
return dfs(0, len(postorder))
149148
}
150149
```
151150

@@ -155,25 +154,19 @@ func helper(postorder []int , left,right int) bool {
155154
class Solution {
156155
public:
157156
bool verifyPostorder(vector<int>& postorder) {
158-
return verify(postorder, 0, postorder.size() - 1);
157+
if (postorder.size() < 2) return true;
158+
return dfs(postorder, 0, postorder.size());
159159
}
160160

161-
bool verify(vector<int>& postorder, int left, int right) {
162-
if (left >= right) {
163-
return true;
164-
}
165-
int root = postorder[right], i = left;
166-
while (postorder[i] < root) {
167-
++i;
168-
}
169-
int mid = i;
170-
while (i < right) {
171-
if (postorder[i] < root) {
172-
return false;
173-
}
174-
++i;
175-
}
176-
return verify(postorder, left, mid - 1) && verify(postorder, mid, right - 1);
161+
bool dfs(vector<int>& postorder, int i, int n) {
162+
if (n <= 0) return 1;
163+
int v = postorder[i + n - 1];
164+
int j = i;
165+
while (j < i + n && postorder[j] < v) ++j;
166+
for (int k = j; k < i + n; ++k)
167+
if (postorder[k] < v)
168+
return 0;
169+
return dfs(postorder, i, j - i) && dfs(postorder, j, n + i - j - 1);
177170
}
178171
};
179172
```
Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
class Solution {
22
public:
33
bool verifyPostorder(vector<int>& postorder) {
4-
return verify(postorder, 0, postorder.size() - 1);
4+
if (postorder.size() < 2) return true;
5+
return dfs(postorder, 0, postorder.size());
56
}
67

7-
bool verify(vector<int>& postorder, int left, int right) {
8-
if (left >= right) {
9-
return true;
10-
}
11-
int root = postorder[right], i = left;
12-
while (postorder[i] < root) {
13-
++i;
14-
}
15-
int mid = i;
16-
while (i < right) {
17-
if (postorder[i] < root) {
18-
return false;
19-
}
20-
++i;
21-
}
22-
return verify(postorder, left, mid - 1) && verify(postorder, mid, right - 1);
8+
bool dfs(vector<int>& postorder, int i, int n) {
9+
if (n <= 0) return 1;
10+
int v = postorder[i + n - 1];
11+
int j = i;
12+
while (j < i + n && postorder[j] < v) ++j;
13+
for (int k = j; k < i + n; ++k)
14+
if (postorder[k] < v)
15+
return 0;
16+
return dfs(postorder, i, j - i) && dfs(postorder, j, n + i - j - 1);
2317
}
24-
};
18+
};
Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
11
func verifyPostorder(postorder []int) bool {
2-
if len(postorder) < 2 {
3-
return true
4-
}
5-
return helper(postorder, 0, len(postorder)-1)
6-
}
7-
// 递归
8-
func helper(postorder []int , left,right int) bool {
9-
if left >= right {
10-
return true
11-
}
12-
// 最后一位即根
13-
rootValue := postorder[right]
14-
// 从左开始往右遍历,直到大于根停止,小于部分是左子树
15-
i := left
16-
for i < right && postorder[i] < rootValue {
17-
i++
18-
}
19-
// 剩下部分是右子树,检查是否都大于根值
20-
for j := i; j < right; j++ {
21-
if postorder[j] < rootValue {
22-
return false
23-
}
24-
}
25-
l := helper(postorder,left,i-1) // 检查左子树,左子树i要减一
26-
r := helper(postorder,i,right-1)// 检查右子树,剔除最后一位是根
27-
return l && r
2+
if len(postorder) < 2 {
3+
return true
4+
}
5+
var dfs func(i, n int) bool
6+
dfs = func(i, n int) bool {
7+
if n <= 0 {
8+
return true
9+
}
10+
v := postorder[i+n-1]
11+
j := i
12+
for j < i+n && postorder[j] < v {
13+
j++
14+
}
15+
for k := j; k < i+n; k++ {
16+
if postorder[k] < v {
17+
return false
18+
}
19+
}
20+
return dfs(i, j-i) && dfs(j, n+i-j-1)
21+
}
22+
return dfs(0, len(postorder))
2823
}
Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
class Solution {
22
public boolean verifyPostorder(int[] postorder) {
3-
int n;
4-
if (postorder == null || (n = postorder.length) == 0) return true;
5-
return verify(postorder, 0, n - 1);
3+
if (postorder == null || postorder.length < 2) {
4+
return true;
5+
}
6+
return dfs(postorder, 0, postorder.length);
67
}
78

8-
private boolean verify(int[] postorder, int p1, int p2) {
9-
if (p1 >= p2) return true;
10-
int pos = p1;
11-
while (pos < p2 && postorder[pos] < postorder[p2]) ++pos;
12-
int p = pos;
13-
while (pos < p2) {
14-
if (postorder[pos] < postorder[p2]) return false;
15-
++pos;
9+
private boolean dfs(int[] postorder, int i, int n) {
10+
if (n <= 0) {
11+
return true;
12+
}
13+
int v = postorder[i + n - 1];
14+
int j = i;
15+
while (j < i + n && postorder[j] < v) {
16+
++j;
17+
}
18+
for (int k = j; k < i + n; ++k) {
19+
if (postorder[k] < v) {
20+
return false;
21+
}
1622
}
17-
return verify(postorder, p1, p - 1) && verify(postorder, p, p2 - 1);
23+
return dfs(postorder, i, j - i) && dfs(postorder, j, n + i - j - 1);
1824
}
1925
}

‎lcof/面试题33. 二叉搜索树的后序遍历序列/Solution.js‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
* @return {boolean}
44
*/
55
var verifyPostorder = function (postorder) {
6-
if (!postorder || postorder.length < 2) return true;
7-
let mid = 0;
8-
let root = postorder[postorder.length - 1];
9-
for (let i = 0; i < postorder.length - 1 && postorder[i] < root; i++) {
10-
mid++;
6+
if (postorder.length < 2) return true;
7+
function dfs(i, n) {
8+
if (n <= 0) return true;
9+
const v = postorder[i + n - 1];
10+
let j = i;
11+
while (j < i + n && postorder[j] < v) ++j;
12+
for (let k = j; k < i + n; ++k) {
13+
if (postorder[k] < v) {
14+
return false;
15+
}
16+
}
17+
return dfs(i, j - i) && dfs(j, n + i - j - 1);
1118
}
12-
for (let i = mid + 1; i < postorder.length - 1; i++) {
13-
if (postorder[i] < root) return false;
14-
}
15-
return (
16-
verifyPostorder(postorder.slice(0, mid)) &&
17-
verifyPostorder(postorder.slice(mid + 1, postorder.length - 1))
18-
);
19+
return dfs(0, postorder.length);
1920
};
Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
class Solution:
22
def verifyPostorder(self, postorder: List[int]) -> bool:
3-
def verify(p1, p2):
4-
if p1>p2:
3+
def dfs(postorder):
4+
if notpostorder:
55
return True
6-
pos = p1
7-
while pos < p2 and postorder[pos] < postorder[p2]:
8-
pos += 1
9-
p = pos
10-
while pos < p2:
11-
if postorder[pos] < postorder[p2]:
12-
return False
13-
pos += 1
14-
return verify(p1, p - 1) and verify(p, p2 - 1)
15-
if not postorder:
16-
return True
17-
return verify(0, len(postorder) - 1)
6+
v = postorder[-1]
7+
i = 0
8+
while i < len(postorder) and postorder[i] < v:
9+
i += 1
10+
if any(x < v for x in postorder[i:]):
11+
return False
12+
return dfs(postorder[:i]) and dfs(postorder[i:-1])
13+
14+
return dfs(postorder)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /