面試題33. 二叉搜索樹的後序遍歷序列python
後序遍歷的序列中,根必定在最後一個。
除了根之外,其餘元素,左子樹的序列在前,右子樹在後,並且左子樹元素必定都小於根,右子樹必定都大於。面試
根據這個能夠把這個數組分紅三部分:根,左子樹,右子樹。而後遞歸判斷,直到分紅長度爲 1 的數組,天然知足條件。遞歸過程當中,若是有不知足條件的就返回 False。數組
時間複雜度:O(n^2)app
class Solution: def verifyPostorder(self, postorder: List[int]) -> bool: def verify(l, r): if l >= r: return True v = postorder[r] i = l while postorder[i] < v: i += 1 mid = i while postorder[i] > v: i += 1 return i == r and verify(l, i-1) and verify(i, r-1) return verify(0, len(postorder)-1)
從後往前看這個數組,最後一個元素是根,而後是右子樹,左子樹。
根 -> 右子樹,元素值應該愈來愈大。大的值都壓入棧中,這個棧就是遞增的。
當遇到一個值小於的時候,說明到了某個左子樹。這時開始 pop 棧中的元素,直到拿出一個小於當前元素的值,這個值就是當前元素的父親。這時就把 root 設爲這個值,而後須要保證這個左子樹上的元素都小於這個根,如不知足就返回 False。post
class Solution: def verifyPostorder(self, postorder: List[int]) -> bool: s, root = [], float('+inf') for v in postorder[::-1]: if v > root: return False while s and s[-1] > v: root = s.pop() s.append(v) return True
參考: https://leetcode-cn.com/probl...code