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

劍指offer22.二叉搜尋樹的後序遍歷序列

https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&tPage=2&rp=2&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

題目描述
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。

二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
後序遍歷是左右中,所以中間值在最後一位。找到第一位大於中間值的數,之後的應該全部大於中間值,否則錯誤。然後就遞迴分別求解左右了,注意當長度大於2時才需要判斷:

# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        if not sequence:
            return False
        mid, i = sequence[-1], 0
        for i in range(len(sequence)):
            if sequence[i] > mid:
                break
        for
j in range(i,len(sequence)): if sequence[j] < mid: return False left, right = True, True if i > 2: left = self.VerifySquenceOfBST(sequence[:i]) if left and len(sequence)-i > 3: right = self.VerifySquenceOfBST(sequence[
i:-1]) return left and right