当前位置: 首页 > news >正文

LeetCode-98. 验证二叉搜索树

一、题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、解答

// 方法1
    // 前一个节点
    TreeNode pre = new TreeNode();
    public boolean isValidBST1(TreeNode root) {
        // 对数进行中序遍历,如果结果是递增,则代表是有效二叉搜索树;否则,不是
        // 不用比较全部节点,只需要比较当前节点和前一个节点即可。
        // 如果当前节点值小于前一个节点,则不是有效二叉搜索树;否则,是。
        // 递归判断左子树,然后判断当前节点和上一个节点值,最后递归判断右子树。
        if(root == null){
            return true;
        }

        if(!isValidBST1(root.left)){
            return false;
        }

        // 如果当前节点值小于前一个节点,则不是有效二叉搜索树;
        if(pre != null && pre.val >= root.val){
              return false;
        }

        // 更新前一个节点为当前节点
        pre = root;

        return isValidBST1(root.right);
    }


    // 方法2
    public boolean isValidBST2(TreeNode root) {
        return checkValidBST(root, null, null);
    }

    /* 限定以 root 为根的子树节点必须满足 max.val > root.val > min.val */
    boolean checkValidBST(TreeNode root, TreeNode min, TreeNode max) {
        if(root == null){
            return true;
        }
        // 若 root.val 不符合 max 和 min 的限制,说明不是合法 BST
        if( min != null && root.val <= min.val){
            return false;
        }
        if(max!= null && root.val >= max.val){
            return false;
        }

        // 限定左子树的最大值是 root.val,右子树的最小值是 root.val
        return checkValidBST(root.left,min,root) && checkValidBST(root.right,root,max);
    }

    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;
        }
    }
http://www.dtcms.com/a/113690.html

相关文章:

  • java流程控制06:While循环
  • HeidiSQL:多数据库管理工具
  • LeeCode题库第1695题
  • 架构下的按钮效果设置
  • Linux网络套接字
  • 【C++11】lambda
  • C# WPF 命令机制(关闭CanExecute自动触发,改手动)
  • Apifox接口测试工具详细解析
  • C# 多线程并发编程基础
  • 【Block总结】PagFM,像素注意力引导融合模块|即插即用
  • 基于STM32的智能门禁系统设计与实现
  • 05-Spring Security 认证与授权机制源码解析
  • python爬虫爬取淘宝热销(热门)零食商品加数据清洗、销量、店铺及词云数据分析_源码及相关说明文档;售后可私博主
  • 【学Rust写CAD】27 双线性插值函数(bilinear_interpolation.rs)
  • python爬虫:DrissionPage实战教程
  • 基于FAN网络的图像识别系统设计与实现
  • 【软考-高级】【信息系统项目管理师】【论文基础】范围管理过程输入输出及工具技术的使用方法
  • linux提取 Suid提权入门 Sudo提权入门
  • (二)使用Android Studio开发基于Java+xml的安卓app之环境搭建
  • 状态机思想编程练习
  • 【学习笔记】pytorch强化学习
  • flutter 专题 七十三Flutter打包未签名的ipa
  • Media streaming mental map
  • 马吕斯定律(Malus‘s Law)
  • [Hot 100] 221. 最大正方形 215. 数组中的第K个最大元素 208. 实现 Trie (前缀树) 207. 课程表
  • Nmap全脚本使用指南!NSE脚本全详细教程!Kali Linux教程!(五)
  • 7-12 最长对称子串(PTA)
  • verilog状态机思想编程流水灯
  • VMware 安装 Ubuntu 全流程实战指南:从零搭建到深度优化
  • 医药档案区块链系统