class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
# 如果 遍历序列为空 返回False
if not sequence or not len(sequence):
return False
# 开始
return self.verify(sequence, 0, len(sequence)-1)
def verify(self, sequence, start, root):
# 如果判断区间为一个或者为空 直接返回true
if start >= root:
return True
# root元素在sequence中的分界点索引 二叉搜索树特点 左子树 <root
for i in range(start, root):
if sequence[i] > sequence[root]:
break
# 判断root的 右子树是否 >root
for j in range(i+1, root): # 注意 原本range(i, root) 这里有个坑,如果在前面的遍历中并没有break掉,而是正常循环结束,那么第二个循环就会有错,例如 sequnce = 6,7。第一个循环结束i=0,第二个循环中正常情况下应该不进入,但是还是会进入并且返回false。所以在python环境下,和java不一样,这里直接写成i+1其实也是不严谨的,严谨一点的应该是,通过break掉的,j in range(i, root); 通过正常循环结束的,j in range(i+1, root)
if sequence[j] < sequence[root]:
return False
# 接着 左右子树分别判断 且得满足二叉搜索树的要求
return self.verify(sequence, start, i-1) and self.verify(sequence, i,root-1)