package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param sequence int整型一维数组
* @return bool布尔型
*/
func VerifySquenceOfBST( sequence []int ) bool {
// write code here
// 后序遍历的最后一个节点一定是根节点
// 前面部分分别是左子树 or 右子树
// 先找左子树部分(找到第一个大于根节点的节点下标)
// 再在右子树部分遍历(如果出现比根节点小的元素,返回 false,右子树值全部大于根节点)
// 继续判断左子树部分、右子树部分是否满足(递归处理)
if len(sequence) == 0 {
return false
}
if len(sequence) == 1 {
return true
}
root := sequence[len(sequence)-1]
// left
i := 0
for i < len(sequence)-1 { //不需要考虑根节点
if sequence[i] > root {
break
}
i++
}
// right 用 j 作为右子树的遍历指针
j := i
for j < len(sequence)-1 {
if sequence[j] < root {
return false
}
j++
}
// 如果遍历到没有左右子树,那么说明已经判断的部分都是符合条件的
left, right := true, true
if i > 0 {
left = VerifySquenceOfBST(sequence[:i])
}
if i < len(sequence)-1 {
right = VerifySquenceOfBST(sequence[i:len(sequence)-1])
}
return left && right
}
