博客
关于我
[LeetCode]98. 验证二叉搜索树 (java实现)递归 dfs
阅读量:798 次
发布时间:2023-04-02

本文共 1122 字,大约阅读时间需要 3 分钟。

为了验证给定的二叉搜索树是否有效,我们可以使用递归的深度优先搜索(DFS)方法来检查每个节点是否符合二叉搜索树的定义。二叉搜索树的定义是:左子树的所有节点值必须小于根节点的值,右子树的所有节点值必须大于根节点的值,并且整个左、右子树也必须是二叉搜索树。

方法思路

我们可以使用递归的方法来检查每个节点是否在其允许的范围内。具体步骤如下:

  • 递归检查:从根节点开始,递归检查每个节点的值是否在其允许的上下界范围内。
  • 上下界范围:对于左子树,节点的值必须小于当前节点的值,因此左子树的递归调用传入当前节点的值作为上界。对于右子树,节点的值必须大于当前节点的值,因此右子树的递归调用传入当前节点的值作为下界。
  • 终止条件:如果当前节点为空,返回true。否则,检查当前节点的值是否在上下界范围内。如果不在,返回false。否则,递归检查左子树和右子树。
  • 解决代码

    class Solution {    public boolean isValidBST(TreeNode root) {        return dfs(root, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);    }    private boolean dfs(TreeNode node, double minVal, double maxVal) {        if (node == null) {            return true;        }        if (node.val <= minVal || node.val >= maxVal) {            return false;        }        return dfs(node.left, minVal, node.val) && dfs(node.right, node.val, Double.POSITIVE_INFINITY);    }}

    代码解释

    • isValidBST 方法:这是入口方法,接受二叉搜索树的根节点,然后调用递归方法dfs,传入初始的上下界范围(-∞, +∞)。
    • dfs 方法:这是递归方法,接受当前节点和上下界范围。首先检查当前节点是否为空,如果是,返回true。否则,检查当前节点的值是否在上下界范围内。如果不在,返回false。否则,递归检查左子树和右子树,左子树传入当前节点的值作为上界,右子树传入当前节点的值作为下界,右子树的上界仍为+∞。

    这种方法确保了每个节点都符合二叉搜索树的定义,递归深度虽然较大,但在LeetCode的测试用例中通常不会导致栈溢出。

    转载地址:http://rmefk.baihongyu.com/

    你可能感兴趣的文章
    Oracle——08PL/SQL简介,基本程序结构和语句
    查看>>
    Oracle——distinct的用法
    查看>>
    Oracle、MySQL、SQL Server架构大对比
    查看>>
    oracle下的OVER(PARTITION BY)函数介绍
    查看>>
    Oracle中DATE数据相减问题
    查看>>
    Oracle中merge into的使用
    查看>>
    oracle中sql查询上月、本月、上周、本周、昨天、今天的数据!
    查看>>
    oracle中sql的case语句运用--根据不同条件去排序!
    查看>>
    Oracle中Transate函数的使用
    查看>>
    oracle中关于日期问题的汇总!
    查看>>
    Oracle中常用的语句
    查看>>
    Oracle中序列的操作以及使用前对序列的初始化
    查看>>
    oracle中新建用户和赋予权限
    查看>>
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    查看>>
    Oracle中的rownum 和rowid的用法和区别
    查看>>
    oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
    查看>>
    oracle中表和视图的区别,oracle中常用表和视图
    查看>>
    oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
    查看>>
    Oracle从11g导出后导入10g
    查看>>
    oracle从备份归档日志的方法集中回收
    查看>>