面试题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

相关文章
相关标签/搜索