劍指offer:二叉搜尋樹的後序遍歷序列
阿新 • • 發佈:2018-12-10
# -*- 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