跳过正文
  1. leetcode 题解/

98_验证二叉搜索树

·123 字·1 分钟

类型:树

    1. 验证二叉搜索树 💛

    https://leetcode-cn.com/problems/validate-binary-search-tree/

    ❓ 验证一棵二叉树是不是搜索树。

    可以用前序、中序、后序三种方法来做,请看 leetcode 提交记录。

    💡 中序遍历

    一棵二叉搜索树的中序遍历结果应该是递增序列。

    class Solution:
        def isValidBST(self, root: TreeNode) -> bool:
            # 对搜索树进行中序遍历,其结果必然是有序的
            if not root:
                return False
    
            res = []
    
            def traverse(node):
                if not node:
                    return
                traverse(node.left)
                res.append(node.val)
                traverse(node.right)
    
            traverse(root)
            return all(res[i] < res[i + 1] for i in range(len(res) - 1))

    时间复杂度:O(n),空间复杂度:O(n)

    💡 递归

    对于搜索树的任意结点来说,其左子树的结点值均小于该结点,其右子树的结点值均大于该结点。

    我们设计一个函数 check(root, lower, upper) 来检查以 root 为根的子树是否结点值均在 (l, r) 范围内(开区间)。一开始的时候,我们的范围应该是 (-inf, +inf)。

    class Solution:
        def isValidBST(self, root: TreeNode) -> bool:
            def check(node, lower = float('-inf'), upper = float('inf')) -> bool:
                if not node:
                    return True
    
                val = node.val
                if val <= lower or val >= upper:
                    return False
    
                if not check(node.right, val, upper):
                    return False
                if not check(node.left, lower, val):
                    return False
                return True
    
            return check(root)

    时间复杂度:O(n),空间复杂度:O(n)