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

LeetCode [中等]98. 验证二叉搜索树

98. 验证二叉搜索树 - 力扣(LeetCode)

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

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

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

思路

由于数据范围限制了二叉搜索树中的结点值的取值范围,因此上述取值范围可以用闭区间表示。对于二叉搜索树的每一个子树(包括原二叉搜索树本身),如果其结点值的取值范围是 [lowerBound,upperBound],子树的根结点值为 mid,则该子树的左子树和右子树的结点值取值范围分别是 [lowerBound,mid−1] 和[mid+1,upperBound]。

判断给定的二叉树是否是二叉搜索树,可以通过判断给定的二叉树的每一个子树是否是二叉搜索树,即每一个子树是否都满足结点值在特定取值范围内。从根结点开始遍历二叉树,对于每个结点,判断其子树的结点值是否在特定取值范围内。

上述过程是一个递归的过程。递归的终止条件有两种情况。

  • 当前结点为空,空树是二叉搜索树。

  • 当前结点不为空且当前结点值不在特定取值范围内,二叉树不是二叉搜索树。

对于其余情况,根据当前子树的取值范围和当前结点值确定左子树和右子树的取值范围,对左子树和右子树调用递归。 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
//精度问题,设置为long类型
public class Solution {
    public bool IsValidBST(TreeNode root) {
       return IsValidBST(root, long.MinValue, long.MaxValue);
    }

    public bool IsValidBST(TreeNode node, long lowerBound, long upperBound)
    {
        if(node == null)
        {
            return true;
        }
        if(node.val < lowerBound || node.val > upperBound)
        {
            return false;
        }
        return IsValidBST(node.left, lowerBound,  (long) node.val - 1) &&
               IsValidBST(node.right,  (long) node.val +1, upperBound);
    }
}
  • 时间复杂度:O(n),其中 n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度:O(n),其中 n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O(n)。


http://www.kler.cn/a/154180.html

相关文章:

  • 【机器学习】聚类算法原理详解
  • RabbitMQ-死信队列(golang)
  • 十:详解HTTP的请求行
  • 【Linux庖丁解牛】—Linux基本指令(下)!
  • 游戏引擎学习第八天
  • zabbix7.0实操指南:基于麒麟V10操作系统部署zabbix7.0
  • uniapp-从后台返回的一串地址信息上,提取省市区进行赋值
  • 数据结构--堆排序
  • 【开源】基于JAVA语言的考研专业课程管理系统
  • YOLOv8界面-目标检测+语义分割+追踪+姿态识别(姿态估计)+界面DeepSort/ByteTrack-PyQt-GUI
  • 【开源】基于Vue+SpringBoot的音乐平台
  • windows配置go调用python的编译环境
  • 【开箱即用】前后端同时开源!周末和AI用Go语言共同研发了一款笔记留言小程序!
  • Web3.0时代:区块链DAPP将如何颠覆传统模式
  • 深度学习:什么是知识蒸馏(Knowledge Distillation)
  • 前端面试灵魂提问(1)
  • 深度学习 -- 神经网络
  • 【Linux】ubuntu配置SSH服务
  • 【HarmonyOS开发】ArkTs编译为SO包的流程记录
  • k8s中Service负载均衡和Service类型介绍
  • Mac苹果视频剪辑:Final Cut Pro Mac
  • 线上CPU飙高问题排查!
  • React-hook-form-mui(五):包含内嵌表单元素的表单
  • 蓝桥杯每日一题2023.12.2
  • 微服务实战系列之Cache
  • 华为OD机试真题-两个字符串间的最短路径问题-2023年OD统一考试(C卷)