首页 > 其他分享 >98. 验证二叉搜索树(中)

98. 验证二叉搜索树(中)

时间:2023-11-02 16:45:39浏览次数:34  
标签:左子 return 验证 二叉 98 False root 节点

目录

题目

  • 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

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

示例 1:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

法一、前序遍历

class Solution:
    def isValidBST(self, root: Optional[TreeNode], left=-inf, right=inf) -> bool:
        if root is None:
            return True
        x = root.val
        return left < x < right and \
        #递归地验证当前节点的左子树和右子树。对于左子树,下一层递归时,将当前节点的值 x 作为新的右边界,而右子树则将 x 作为新的左边界。如果左子树和右子树都是有效的二叉搜索树,则返回 True;否则返回 False
               self.isValidBST(root.left, left, x) and \#递归左子树
               self.isValidBST(root.right, x, right)#递归右子树

法二、中序遍历

  • 二叉搜索树的中序遍历的结果是一个升序序列,判断当前节点的值是否大于前一个遍历节点的值,满足了说明这个节点是满足二叉搜索树条件的,否则就不满足。

  • 由于首个节点没有上一个节点,为了统一计算,初始上一个节点为一个极小值,这样首个节点更新时,其与上一个节点的差值将是一个极大值,从而不会影响最小绝对差的更新

class Solution:
    pre = -inf # 上一个遍历的值,初始化为比节点可取的最小值还小的值,保证第一个节点通过

    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        if root is None:  # 空节点,无需处理,返回 True
            return True
        if self.isValidBST(root.left) is False :#左子树搜索不通过
            return False
        if root.val <= self.pre:
            return False  # 前一个节点值大于等于当前值,返回 False
        self.pre = root.val  # 更新上一个遍历的节点 
        if self.isValidBST(root.right) is False:#写法等价于if not self.isValidBST(root.right):#先对得到的结果取反,再判断如果是true则进入
            return False  # 右子树搜索不通过,返回 False
        return True

模拟:root = [5,1,4,null,null,3,6]
1.root=5!=none,递归左子树:root=1!=none,递归左子树:为none,return true,判断(true is false)为false不进入;1<=-inf不满足不进入;pre=1;递归右子树:为
none,return true,判断(true is false)为false不进入;最后执行完一遍,return true
2.现在判断完5的左子树为true,5<=1不满足,不进入;pre=5;递归右子树4:4!=none不进入,判断4的左子树:3!=none,判断3的左子树,为none,return ture;3<=5满
足,进入返回False,结束程序

if not语法

if not (...):#先对(...)的结果取反,再判断如果是true则进入
    return False
if (...) is False:#对(...)的结果判断如果是False,表示满足if条件则进入
    return False

法三、后序遍历

class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        def dfs(node: Optional[TreeNode]) -> Tuple:
            if node is None:
                return inf, -inf
            l_min, l_max = dfs(node.left)
            r_min, r_max = dfs(node.right)
            x = node.val
            # 也可以在递归完左子树之后立刻判断,如果发现不是二叉搜索树,就不用递归右子树了
            if x <= l_max or x >= r_min:
                return -inf, inf
            return min(l_min, x), max(r_max, x)
        return dfs(root)[1] != inf

标签:左子,return,验证,二叉,98,False,root,节点
From: https://www.cnblogs.com/lushuang55/p/17801551.html

相关文章

  • 网站验证码cookie,localStorage
    很多网站登录或则注册时,都会做一个利用手机号获取验证码证明为本人操作的选项。当然为了网站的web网站安全和防止信息炸弹等恶意操作,都会对再次获取验证码做一个倒计时,一般都为60s。而正常情况下只需利用JS定时函数很容易实现,这种情况下用户一旦刷新页面,页面dom中我们定义的js变量......
  • 纯前端实现图片验证码
    前言之前业务系统中验证码一直是由后端返回base64与一个验证码的字符串来实现的,想了下,前端其实可以直接canvas实现,减轻服务器压力。实现子组件,允许自定义图片尺寸(默认尺寸为100*40)与验证码刷新时间(默认时间为60秒)。同时暴露绘制验证码方法drawPic(),允许父组件直接调用(......
  • 验证2个节点udp和tcp可通性
    -u表示udp,默认是tcp。-l表示作为server监听。server:192.168.0.104上开启udp123端口server发送11client:连接192.168.0.104上udp123端口client发送100 server:192.168.0.104上开启tcp123端口server发送102client:连接192.168.0.104上tcp123端口client发送101......
  • 深度学习相关问题的记录:验证集loss上升,准确率却上升
    验证集loss上升,准确率却上升验证集loss上升,acc也上升这种现象很常见,原因是过拟合或者训练验证数据分布不一致导致,即在训练后期,预测的结果趋向于极端,使少数预测错的样本主导了loss,但同时少数样本不影响整体的验证acc情况。ICML2020发表了一篇文章:《DoWeNeedZeroTrainingLossAf......
  • 掌握正则验证字串符,轻松搞定字符串匹配
    正则验证字串符是一种强大的工具,可以帮助程序员在处理字符串时轻松进行复杂匹配。本文将介绍正则表达式的概念、语法和在编程中的应用,并通过实例演示如何使用正则表达式进行字符串匹配、替换和提取等操作。一、正则表达式概述在编程中,字符串的处理是不可避免的一部分。我们经常......
  • 掌握正则验证字串符,轻松搞定字符串匹配
    正则验证字串符是一种强大的工具,可以帮助程序员在处理字符串时轻松进行复杂匹配。本文将介绍正则表达式的概念、语法和在编程中的应用,并通过实例演示如何使用正则表达式进行字符串匹配、替换和提取等操作。一、正则表达式概述在编程中,字符串的处理是不可避免的一部分。我们经常需......
  • php:bcrypt加密和验证(php 8.1)
    一,相关文档:https://www.php.net/manual/zh/function.password-hash.php二,php代码:12345678910111213141516171819202122232425/* *测试用bcrypt方式验证密码 *用password_hash和password_verify一对函数实现 **/publicfunct......
  • 关于二叉树中三种深度遍历方式的理解
    今日刷题,538.把二叉搜索树转换为累加树。明确知道利用二叉搜索树中序遍历的情况下是有序数组这一个特点,进行“逆中序”来累加。但是在递归时却还是有些没有搞清楚一些细节,终究还是没有掌握。问题主要还是在于递归返回值的处理上:在中序遍历的情况下,似乎对于左右两个节点的遍历,不......
  • 104.二叉树的最大深度
    目录题目法一、后序遍历法二、层序遍历题目给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2法一、后序遍历后序遍历......
  • [Leetcode] 0111. 二叉树的最小深度
    111.二叉树的最小深度题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。 示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输......