劍指—JZ23二叉搜索樹的後序遍歷序列

題目描述

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

解題思路

遞歸解法

樹的後序遍歷方式是左右根,比如對於遍歷序列

[4,8,6,12,16,14,10]

那麼就可以知道10就是根節點,前面的左子樹和右子樹需要進一步判斷。

二叉平衡樹的條件是左子樹全部小於根結點,右子樹全部大於根節點。對於上述序列,首先找到根節點10,然後從頭開始遍歷,找到第一個大於10的下標,然後從下標開始到最後的切片序列應該全部大於10,如果一個不滿足,就返回False,然後遞歸對兩邊子樹做相同的操作。

class Solution:
    def VerifySquenceOfBST(self, sequence):
        if not sequence:
            return False
        root = sequence[-1]
        i = 0
        while i < len(sequence) - 1:
            if sequence[i] > root:
                break
            i += 1
        for j in range(i, len(sequence) - 1):
            if sequence[j] < root:
                return False
        #由於函數中只有返回False的條件判斷,因此首先得將left和right都賦值爲True,不然後面不管任何條件全是False
        left = True; right = True
        if i > 0:
            left = self.VerifySquenceOfBST(sequence[:i])
        if i < len(sequence) - 1:
            right = self.VerifySquenceOfBST(sequence[i: len(sequence) - 1])
        return left and right

S = Solution()
print(S.VerifySquenceOfBST([4,8,6,12,16,14,10]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章