输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
给定的模版是:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {}
}
思路很简单,所谓二叉搜索树即对根节点即其左右子树,其左子树的所有值都小于根,右子树的所有值都大于根。
那么在这个后序遍历的数组中从数组中最后一个元素根节点往前找,找到一个分界点,左边的部分都小于根,右边的部分都大于根。
并且左、右两边的部分都需要满足上述条件,这明显递归就可以。
但如果按给定的函数递归,参数是数组,还需要把数组拆分,再这道题中是麻烦的。我这样做的代码有70多行,但如果换个思路,用自己定义的函数,参数除了这个开始给定的数组,加上起始,结束点,即可实现数组分割了,给这俩参数不同值,就相当于数组的不同部分。
代码如下(别人写的):
链接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd
来源:牛客网
public
class
Solution {
public
boolean
VerifySquenceOfBST(
int
[] sequence) {
if
(sequence.length==
0
)
return
false
;
if
(sequence.length==
1
)
return
true
;
return
ju(sequence,
0
, sequence.length-
1
);
}
public
boolean
ju(
int
[] a,
int
star,
int
root){
if
(star>=root)
return
true
;
int
i = root;
//从后面开始找
while
(i>star&&a[i-
1
]>a[root])
i--;
//找到比根小的坐标
//从前面开始找 star到i-1应该比根小
for
(
int
j = star;j<i-
1
;j++)
if
(a[j]>a[root])
return
false
;;
return
ju(a,star,i-
1
)&&ju(a, i, root-
1
);
}
}