Skip to content

Commit dc75b49

Browse files
committed
feat: add solutions to lcof problem: No.33
1 parent d489f15 commit dc75b49

File tree

8 files changed

+327
-169
lines changed

8 files changed

+327
-169
lines changed

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

Lines changed: 238 additions & 90 deletions
Large diffs are not rendered by default.
Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
class Solution {
22
public:
33
bool verifyPostorder(vector<int>& postorder) {
4-
if (postorder.size() < 2) return true;
5-
return dfs(postorder, 0, postorder.size());
6-
}
7-
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);
4+
function<bool(int, int)> dfs = [&](int l, int r) -> bool {
5+
if (l >= r) {
6+
return true;
7+
}
8+
int v = postorder[r];
9+
int i = l;
10+
while (i < r && postorder[i] < v) {
11+
++i;
12+
}
13+
for (int j = i; j < r; ++j) {
14+
if (postorder[j] < v) {
15+
return false;
16+
}
17+
}
18+
return dfs(l, i - 1) && dfs(i, r - 1);
19+
};
20+
return dfs(0, postorder.size() - 1);
1721
}
1822
};
Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
public class Solution {
2+
private int[] postorder;
3+
24
public bool VerifyPostorder(int[] postorder) {
3-
if (postorder.Length == 0) {
5+
this.postorder = postorder;
6+
return dfs(0, postorder.Length - 1);
7+
}
8+
9+
private bool dfs(int l, int r) {
10+
if (l >= r) {
411
return true;
512
}
6-
var root = postorder[^1];
7-
int n = postorder.Length, i = 0;
8-
while (i < n && postorder[i] < root) {
9-
i += 1;
13+
int v = postorder[r];
14+
int i = l;
15+
while (i < r && postorder[i] < v) {
16+
++i;
1017
}
11-
for (int j = i; j < n - 1; j++) {
12-
if (postorder[j] < root) {
18+
for (int j = i; j < r; ++j) {
19+
if (postorder[j] < v) {
1320
return false;
1421
}
1522
}
16-
return VerifyPostorder(postorder[..i]) && VerifyPostorder(postorder[i..^1]);
23+
return dfs(l, i - 1) && dfs(i, r - 1);
1724
}
1825
}
Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
func verifyPostorder(postorder []int) bool {
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 {
2+
var dfs func(l, r int) bool
3+
dfs = func(l, r int) bool {
4+
if l >= r {
85
return true
96
}
10-
v := postorder[i+n-1]
11-
j := i
12-
for j < i+n && postorder[j] < v {
13-
j++
7+
v := postorder[r]
8+
i := l
9+
for i < r && postorder[i] < v {
10+
i++
1411
}
15-
for k := j; k < i+n; k++ {
16-
if postorder[k] < v {
12+
for j := i; j < r; j++ {
13+
if postorder[j] < v {
1714
return false
1815
}
1916
}
20-
return dfs(i, j-i) && dfs(j, n+i-j-1)
17+
return dfs(l, i-1) && dfs(i, r-1)
2118
}
22-
return dfs(0, len(postorder))
19+
return dfs(0, len(postorder)-1)
2320
}
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
class Solution {
2+
private int[] postorder;
3+
24
public boolean verifyPostorder(int[] postorder) {
3-
if (postorder == null || postorder.length < 2) {
4-
return true;
5-
}
6-
return dfs(postorder, 0, postorder.length);
5+
this.postorder = postorder;
6+
return dfs(0, postorder.length - 1);
77
}
88

9-
private boolean dfs(int[] postorder, int i, int n) {
10-
if (n <= 0) {
9+
private boolean dfs(int l, int r) {
10+
if (l >= r) {
1111
return true;
1212
}
13-
int v = postorder[i + n - 1];
14-
int j = i;
15-
while (j < i + n && postorder[j] < v) {
16-
++j;
13+
int v = postorder[r];
14+
int i = l;
15+
while (i < r && postorder[i] < v) {
16+
++i;
1717
}
18-
for (int k = j; k < i + n; ++k) {
19-
if (postorder[k] < v) {
18+
for (int j = i; j < r; ++j) {
19+
if (postorder[j] < v) {
2020
return false;
2121
}
2222
}
23-
return dfs(postorder, i, j - i) && dfs(postorder, j, n + i - j - 1);
23+
return dfs(l, i - 1) && dfs(i, r - 1);
2424
}
2525
}

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

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,21 @@
33
* @return {boolean}
44
*/
55
var verifyPostorder = function (postorder) {
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) {
6+
const dfs = (l, r) => {
7+
if (l >= r) {
8+
return true;
9+
}
10+
const v = postorder[r];
11+
let i = l;
12+
while (i < r && postorder[i] < v) {
13+
++i;
14+
}
15+
for (let j = i; j < r; ++j) {
16+
if (postorder[j] < v) {
1417
return false;
1518
}
1619
}
17-
return dfs(i, j - i) && dfs(j, n + i - j - 1);
18-
}
19-
return dfs(0, postorder.length);
20+
return dfs(l, i - 1) && dfs(i, r - 1);
21+
};
22+
return dfs(0, postorder.length - 1);
2023
};
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
class Solution:
22
def verifyPostorder(self, postorder: List[int]) -> bool:
3-
def dfs(postorder):
4-
if not postorder:
3+
def dfs(l, r):
4+
if l >= r:
55
return True
6-
v = postorder[-1]
7-
i = 0
8-
while i < len(postorder) and postorder[i] < v:
6+
v = postorder[r]
7+
i = l
8+
while i < r and postorder[i] < v:
99
i += 1
10-
if any(x < v for x in postorder[i:]):
10+
if any(x < v for x in postorder[i:r]):
1111
return False
12-
return dfs(postorder[:i]) and dfs(postorder[i:-1])
12+
return dfs(l, i - 1) and dfs(i, r - 1)
1313

14-
return dfs(postorder)
14+
return dfs(0, len(postorder) - 1)
Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
function verifyPostorder(postorder: number[]): boolean {
2-
const dfs = (start: number, end: number, maxVal: number) => {
3-
if (start > end) {
2+
const dfs = (l: number, r: number): boolean => {
3+
if (l >= r) {
44
return true;
55
}
6-
const rootVal = postorder[end];
7-
for (let i = end; i >= start; i--) {
8-
const val = postorder[i];
9-
if (val > maxVal) {
6+
const v = postorder[r];
7+
let i = l;
8+
while (i < r && postorder[i] < v) {
9+
++i;
10+
}
11+
for (let j = i; j < r; ++j) {
12+
if (postorder[j] < v) {
1013
return false;
1114
}
12-
if (val < rootVal) {
13-
return dfs(start, i, rootVal) && dfs(i + 1, end - 1, maxVal);
14-
}
1515
}
16-
return dfs(start, end - 1, maxVal);
16+
return dfs(l, i - 1) && dfs(i, r - 1);
1717
};
18-
const n = postorder.length;
19-
return dfs(0, n - 1, Infinity);
18+
return dfs(0, postorder.length - 1);
2019
}

0 commit comments

Comments
 (0)