LCR 152. 验证二叉搜索树的后序遍历序列


class VerifyTreeOrder:
    """
    LCR 152. 验证二叉搜索树的后序遍历序列
    https://leetcode.cn/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/description/
    """
    def solution(self, postorder: List[int]) -> bool:
        return self.check(postorder, 0, len(postorder) - 1)

    # 检查postorder[i, j] 是否为BST
    def check(self, postorder, i, j):
        if i >= j:
            return True

        root = postorder[j]
        #  postorder[i..left) 是左⼦树,应该都⼩于 root
        left = i
        while left < j and postorder[left] < root:
            left += 1

        #  postorder[left..j) 是右⼦树,应该都大于 root
        right = left
        while right < j and postorder[right] > root:
            right += 1

        if right != j:
            return False

        # 递归检查左⼦树 [i..left) 和右⼦树 [left..j) 也符合 BST 的性质
        return self.check(postorder, i, left - 1) and self.check(postorder, left, j - 1)


10-14 01:53