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


    98. 验证二叉搜索树

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

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

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

    示例 1:

    在这里插入图片描述

    输入:root = [2,1,3]
    输出:true
    示例 2:

    在这里插入图片描述

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

    提示:

    树中节点数目范围在[1, 104] 内
    -231 <= Node.val <= 231 - 1

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/validate-binary-search-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    分析

    需要了解二叉搜索树的性质:如果二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也为二叉搜索树。
    我们可以设计一个递归函数 helper(root, lower, upper) 来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (lower, upper) 的范围内。如果 root 节点的值 val 不在 (lower, upper) 的范围内说明不满足条件直接返回,否则我们要继续递归调用检查它的左右子树是否满足,如果都满足才说明这是一棵二叉搜索树。
    那么根据二叉搜索树的性质,在递归调用左子树时,我们需要把上界 upper 改为 root.val,即调用 helper(root.left, lower, root.val),因为左子树里所有节点的值均小于它的根节点的值。同理递归调用右子树时,我们需要把下界 lower 改为 root.val,即调用 helper(root.right, root.val, upper)。

    题解(Java)

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public boolean isValidBST(TreeNode root) {
            return dfs(root, Long.MIN_VALUE, Long.MAX_VALUE);
        }
    
        private boolean dfs(TreeNode root, long lower, long upper) {
            if (root == null) {
                return true;
            }
            if (root.val <= lower || root.val >= upper) {
                return false;
            }
            return dfs(root.left, lower, root.val) && dfs(root.right, root.val, upper);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    2271. 毯子覆盖的最多白色砖块数-快速排序+滑动窗口,力扣双百代码
    TensorFlow-Federated简介与安装
    Python爬虫在电商数据获取与分析中的应用
    收藏:不能不刷的数字后端面试题,含解析
    原生input使用+v-model在input中使用
    自适应点云配准(RANSAC、ICP)
    [AI绘画] 即插即用!SDXL+T2I-Adapters 高效可控的生成图片
    机器学习课后习题 ---数学基础回顾
    普及篇|云备份和云容灾,你用对了吗?
    掌动智能:替代JMeter的压力测试工具有哪些
  • 原文地址:https://blog.csdn.net/weixin_43942435/article/details/125548373