面試題33. 二叉搜索樹的後序遍歷序列

面試題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

相關文章
相關標籤/搜索