题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
这是剑指offer上的一道题目,剑指上的解法:去掉最后一个元素x,
T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列(递归),复杂度O(n2);
A过的代码如下:
public
class
Solution {
public
boolean
VerifySquenceOfBST(
int
[] sequence) {
if
(sequence.length==
0
){
return
false
;
}
return
isBST(sequence,
0
,sequence.length-
1
);
}
public
boolean
isBST(
int
[] sequence,
int
start,
int
end){
if
(start==end||start==end-
1
){
return
true
;
}
int
i,j;
for
(i=start;i<end;i++){
if
(sequence[i]>sequence[end]){
break
;
}
}
if
(i==end){
return
isBST(sequence,start,end-
1
);
}
for
(j=i;j<end;j++){
if
(sequence[j]<sequence[end]){
return
false
;
}
}
return
start<i-
1
?isBST(sequence,start,i-
1
)&&isBST(sequence,i,end-
1
):isBST(sequence,i,end-
1
);
}
}
|
A过的代码如下:
import
java.util.Stack;
public
class
Solution {
public
boolean
VerifySquenceOfBST(
int
[] sequence) {
if
(sequence.length==
0
){
return
false
;
}
Stack<Integer> stack =
new
Stack<Integer>();
int
index=Integer.MAX_VALUE;
for
(
int
i=sequence.length-
1
;i>=
0
;i--){
if
(sequence[i]>index){
return
false
;
}
if
(stack.empty()||sequence[i]>stack.peek()){
stack.push(sequence[i]);
continue
;
}
while
(!stack.empty()&&sequence[i]<stack.peek()){
index=stack.pop();
}
stack.push(sequence[i]);
}
return
true
;
}
}