1. 程式人生 > >劍指offer:二叉搜尋樹的後序遍歷序列

劍指offer:二叉搜尋樹的後序遍歷序列

# -*- 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