力扣刷题Python笔记:验证二叉搜索树

题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

力扣刷题Python笔记:验证二叉搜索树_第1张图片
来源:力扣(LeetCode)

Python解法

回溯解法

吐槽一句,CSDN的系统通知真的很死ma,每天各种辣鸡推送~

又是一个二叉搜索树,终究还是没有逃过回溯解法~看了官方题解,中序遍历没看懂,回溯解法很好理解,以下解题思路和代码均来自力扣题解。

具体的解题思路如下:
①设计一个递归函数 helper(root, lower, upper),函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在相应的范围内;
②根据二叉搜索树的性质,在递归调用左子树时,我们需要把上界 upper 改为 root.val,即调用 helper(root.left, lower, root.val),因为左子树里所有节点的值均小于它的根节点的值;
③同理,递归调用右子树时,我们需要把下界 lower 改为 root.val,即调用 helper(root.right, root.val, upper);
④如果 root 节点的值 val 不在相应范围内,说明不满足条件直接返回 False,否则我们要继续递归调用检查它的左右子树是否满足范围条件,如果都满足才说明这是一棵二叉搜索树;
⑤函数递归调用的入口为 helper(root, -inf, +inf), inf 表示一个无穷大的值。

代码如下:

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

        if not helper(node.right, val, upper):
            return False
        if not helper(node.left, lower, val):
            return False
        return True

    return helper(root)

你可能感兴趣的:(力扣python刷题,算法)