題目描述
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出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]))