49
49
``` python
50
50
class Solution :
51
51
def verifyPostorder (self , postorder : List[int ]) -> bool :
52
- n = len (postorder)
53
- if n < 2 :
52
+ def verify (p1 , p2 ):
53
+ if p1 > p2:
54
+ 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:
54
65
return True
55
- for i in range (n):
56
- if postorder[i] > postorder[- 1 ]:
57
- break
58
- for j in range (i + 1 , n - 1 ):
59
- if postorder[j] < postorder[- 1 ]:
60
- return False
61
- return (i == 0 or self .verifyPostorder(postorder[:i])) and (i == n - 1 or self .verifyPostorder(postorder[i:- 1 ]))
62
-
66
+ return verify(0 , len (postorder) - 1 )
63
67
```
64
68
65
69
### ** Java**
@@ -69,30 +73,21 @@ class Solution:
69
73
``` java
70
74
class Solution {
71
75
public boolean verifyPostorder (int [] postorder ) {
72
- if (postorder. length == 0 ) {
73
- return true ;
74
- }
75
- return verifyPostorder(postorder, 0 , postorder. length - 1 );
76
+ int n;
77
+ if (postorder == null || (n = postorder. length) == 0 ) return true ;
78
+ return verify(postorder, 0 , n - 1 );
76
79
}
77
80
78
- private boolean verifyPostorder (int [] postorder , int from , int to ) {
79
- if (from == to) {
80
- return true ;
81
- }
82
- int i = from, j = from;
83
- for (; i < to; ++ i) {
84
- if (postorder[i] > postorder[to]) {
85
- break ;
86
- }
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;
87
89
}
88
- for (j = i + 1 ; j < to; ++ j) {
89
- if (postorder[j] < postorder[to]) {
90
- return false ;
91
- }
92
- }
93
- return (i == from || verifyPostorder(postorder, from, i - 1 )) && (i == to || verifyPostorder(postorder, i, to - 1 ));
94
-
95
-
90
+ return verify(postorder, p1, p - 1 ) && verify(postorder, p, p2 - 1 );
96
91
}
97
92
}
98
93
```
@@ -130,26 +125,26 @@ func verifyPostorder(postorder []int) bool {
130
125
}
131
126
return helper (postorder, 0 , len (postorder)-1 )
132
127
}
133
- // 递归
128
+ // 递归
134
129
func helper (postorder []int , left ,right int ) bool {
135
130
if left >= right {
136
131
return true
137
132
}
138
- // 最后一位即根
133
+ // 最后一位即根
139
134
rootValue := postorder[right]
140
- // 从左开始往右遍历,直到大于根停止,小于部分是左子树
135
+ // 从左开始往右遍历,直到大于根停止,小于部分是左子树
141
136
i := left
142
137
for i < right && postorder[i] < rootValue {
143
138
i++
144
139
}
145
- // 剩下部分是右子树,检查是否都大于根值
140
+ // 剩下部分是右子树,检查是否都大于根值
146
141
for j := i; j < right; j++ {
147
142
if postorder[j] < rootValue {
148
143
return false
149
144
}
150
145
}
151
- l := helper (postorder,left,i-1 ) // 检查左子树,左子树i要减一
152
- r := helper (postorder,i,right-1 )// 检查右子树,剔除最后一位是根
146
+ l := helper (postorder,left,i-1 ) // 检查左子树,左子树i要减一
147
+ r := helper (postorder,i,right-1 )// 检查右子树,剔除最后一位是根
153
148
return l && r
154
149
}
155
150
```
0 commit comments