# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
'''
if sequence==[]:
return False
return self.judge(sequence,0,len(sequence)-1)
def judge(self,seq,start,end):
if start>=end:
return True
root=seq[end]
i=end
while i>start and seq[i-1]>seq[end]:
i=i-1
j=i-1
while j>=start:
if seq[j]>seq[end]:
return False
j=j-1
return self.judge(seq,start,i-1) and self.judge(seq,i,end-1)
'''
if len(sequence)==0:
return False
return self.charge(sequence)
def charge(self,sequence):
length=len(sequence)
if length==0:
return True
if length==1:
return True
root=sequence[-1]
small=0
while sequence[small]<root:
small+=1
for i in range(small,length-1):
if sequence[i]<root:
return False
return self.charge(sequence[:small]) and self.charge(sequence[small:length-1])
'''
left=right=True
if len(sequence[:small])>0:
left=self.VerifySquenceOfBST(sequence[:small])
if len(sequence[small:length-1]):
right=self.VerifySquenceOfBST(sequence[small:length-1])
return left and right
'''
二叉搜索树是父节点的左孩子都比父节点小,右孩子都比父节点大。首先从根节点开始判断,根节点是s[-1],即最后一个元素。然后从数组开始遍历,找到不满足s[small]<root时,再从small开始遍历,如果不满足s[small]>root,返回false。注意递归的终点是遍历到叶子节点,或空节点,此时数组只有一个元素或没有元素。
还有一些细节:
while sequence[small]<root:
small+=1
for i in range(small,length-1):
if sequence[i]<root:
return False
判断边界,s[small]<root不满足时,small+1已经执行,此时是在>root的一边,所以后面递归时的左子树是s[:small],刚好取到<root的所有。
第二个判断时length-1写成length也是可以的,因为判断到root时s[i]==root<root也不成立,不会触发return false