【LeetCode-中等题】98. 验证二叉搜索树

文章目录

    • 题目
    • 方法一:BFS 层序遍历
    • 方法二: 递归
    • 方法三: 中序遍历(栈)
    • 方法四: 中序遍历(递归)

题目

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

思路就是首先得知道什么是二叉搜索树
左孩子在(父节点的最小值,父节点)区间内
右孩子在(父节点,父节点的最大值)区间内
只要满足这两点就行

方法一:BFS 层序遍历

利用层序遍历 拿到每一个节点 并且给每一个结点配备一个最大值和最小值的队列
只要节点在最大值和最小值之间就满足二叉搜索树的条件
在这里插入图片描述

在这里插入图片描述

public boolean isValidBST(TreeNode root) {

        if(root == null) return true;

        Queue<TreeNode> queue = new LinkedList<>();
        Queue<Long> minValues = new LinkedList<>();//定义两个队列来记录每一个节点的最大值和最小值情况  
        Queue<Long> maxValues = new LinkedList<>();

        queue.offer(root);
        minValues.offer(Long.MIN_VALUE); // 初始最小值为
        maxValues.offer(Long.MAX_VALUE); // 初始最大值为
        while(!queue.isEmpty()){
            int count = queue.size();
            for(int i = 0 ; i < count ; i++){
                TreeNode node =  queue.poll();
                Long minValue = minValues.poll();//弹出该对比节点的最大值和最小值情况   节点值必须在这个区间内才满足条件
                Long maxValue = maxValues.poll();
                if (  node.val <= minValue ||  node.val >= maxValue) {
                    return false;
                }
                if(node.left != null){
                    queue.offer(node.left);
                    minValues.offer(minValue);//  左子树的最小值沿用上一次的最小值
                    maxValues.offer((long)node.val); // 左子树的最大值为当前节点值
                }
                if(node.right != null){
                    queue.offer(node.right);
                    minValues.offer((long)node.val); // 右子树的最小值为当前节点值
                    maxValues.offer(maxValue); // 右子树的最大值沿用上一次的最大值
                }
            }
    }
    return true;

    }

方法二: 递归

	   // root.val要在  (min,max) 区间才是二叉搜索数
      //  判断左子树 和右子树是否是搜索二叉树   
     //   ==左孩子在(父节点的最小值,父节点)区间内==
	// 	  ==右孩子在(父节点,父节点的最大值)区间内==
    public boolean isValidBST(TreeNode root) {
            return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);   // 不能用Integer.MAX  2147483647  案例有root就等于2147483647  明显不满足搜索树
    }
     public boolean isValidBST(TreeNode root,long  min,long  max) {
           if(root == null ){
               return true;
           }
           if(root.val <= min || root.val >= max) return false;//root.val要在  (min,max) 区间才是二叉搜索数
        
           return isValidBST(root.left,min,root.val)&&isValidBST(root.right,root.val,max);
           //判断左子树 和右子树是否是搜索二叉树   
         //   ==左孩子在(父节点的最小值,父节点)区间内==
		// 	  ==右孩子在(父节点,父节点的最大值)区间内==
 
    }

方法三: 中序遍历(栈)

  1. 核心先遍历左子树,直到左子树为null 再去遍历右子树,直到右子树为null
  2. 每弹出一个节点的值小于等于前一个 inorder,说明不是二叉搜索树
  3. 在遍历右子树的同时 更新inorder值为当前节点
  public boolean isValidBST(TreeNode root) {
         Deque<TreeNode> stack = new LinkedList<TreeNode>();//栈
          Long inorder = Long.MIN_VALUE;

          while(!stack.isEmpty() || root !=null){
              while(root != null){//先去遍历左子树
                stack.push(root);
                root = root.left;
              }

              root = stack.pop();
               // 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
              if(root.val <= inorder) return false;

                inorder = (long)root.val;
                root = root.right;//遍历右子树

          }
     return true;
    }

方法四: 中序遍历(递归)

中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST,继续遍历;否则直接返回 false。

 long pre = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
       
        if(root == null) return true;
        //判断左子树是不是 二叉搜索时
        if(!isValidBST(root.left)) return false;

        if(root.val <= pre) return false ;
        else pre = root.val;

         //判断右子树是不是 二叉搜索时
        if(!isValidBST(root.right)) return false;

        return true;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/98204.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷宋红康MySQL笔记 14-18

是记录&#xff0c;不会太详细&#xff0c;受本人知识限制会有错误&#xff0c;会有个人的理解在里面 第14章 视图 了解一下&#xff0c;数据库的常见对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记…

博睿数据当选粤港澳大湾区金融创新研究院理事会单位,助力金融科技创新发展

近日&#xff0c;博睿数据当选粤港澳大湾区金融创新研究院理事会单位。这是对博睿数据在金融科技领域所取得成绩的高度认可&#xff0c;也是对其创新能力和发展潜力的充分肯定。 粤港澳大湾区金融创新研究院由粤港澳三地金融行业、高等院校高层和专家学者共同发起&#xff0c;经…

QT初始学习中的个人基础认知

整体感觉 安装的时候感觉更像python的库安装和编译器版本的配合安装。进入创建工程时&#xff0c;感觉是c语言的创建工程的感觉&#xff0c;而且可以看到main和h的头文件&#xff0c;整体来看是C来编写的程序。完成整个工程个人感觉是C编写功能&#xff0c;使用VB实现界面设计…

2023-8-31 spfa判断负环

题目链接&#xff1a;spfa判断负环 #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 100010;int n, m; int h[N], e[N], w[N], ne[N], idx;int dist[N], cnt[N]; int st[N];void ad…

SpringBoot的四种handler类型

Controller ReuestMapping 实现Controller接口 使用Component将该类封装成一个Bean 实现HttpRequestHandler 实现RouterFunction

leetcode 516. 最长回文子序列

2023.8.27 本题依旧使用dp算法做&#xff0c;可以参考 回文子串 这道题。dp[i][j]定义为&#xff1a;子串s[i,j] 的最长回文子串。 直接看代码: class Solution { public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(),vector<int&…

vue v-for 例子

vue v-for 例子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…

4年外包终上岸,我只能说这类公司能不去就不去...

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是4年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

python把txt变成list,并且写入xslx文件

需求&#xff1a; 1、把txt文件的内容变成list 2、然后写入excel中 txt文件内容 IP.txt 192.168.199.201,4C8G,200G 192.168.199.202,4C8G,200G 192.168.199.203,4C8G,200G 192.168.199.204,4C8G,200G 192.168.199.205,4C8G,200G192.168.199.206,4C8G,200G 192.168.199.207…

C语言每日一练--------Day(8)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;图片整理 寻找数组下标 &#x1f493;博主csdn个人主页&#xff1a;小小…

docker 学习-- 04 实践搭建 1(宝塔)

docker 学习-- 04 实践 1&#xff08;宝塔&#xff09; docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 docker 学习-- 03 环境安装 docker 学习-- 04 实践 1&#xff08;宝塔&#xff09; docker 学习-- 04 实践 2 &#xff08;lnpmr环境&#xff09; 通过上面的学…

操作符算数转换题

目录 1.交换两个变量&#xff08;不创建临时变量&#xff09; 2.统计二进制中1的个数 3.打印整数二进制的奇数位和偶数位 4.求两个数二进制中不同位的个数 5.【一维数组】有序序列合并 6.获得月份天数 7.变种水仙花数 8.选择题总结tips 这篇博文主要分享操作符&算…

头歌MYSQL——课后作业6 函数

第1关&#xff1a;数值函数 任务描述 本关任务&#xff1a;对表达式取整 相关知识 四舍五入的函数 ROUND(X,D) 返回X&#xff0c;其值保留到小数点后D位&#xff0c;而第D位的保留方式为四舍五入。 若D的值为0,则对小数部分四舍五入。 若将D设为负值&#xff0c;保留X值小数…

Linux(实操篇二)

Linux实操篇 Linux(实操篇二)1. 常用基本命令1.3 时间日期类1.3.1 date显示当前时间1.3.2 显示非当前时间1.3.3 date设置系统时间1.3.4 cal查看日历 1.4 用户管理命令1.4.1 useradd添加新用户1.4.2 passwd设置用户密码1.4.3 id查看用户是否存在1.4.4 cat /etc/passwd 查看创建了…

Apache SeaTunnel 2.3.3 版本发布,CDC 支持 Schema Evolution!

时隔两个月&#xff0c; Apache SeaTunnel 终于迎来大版本更新。此次发布的 2.3.3 版本在功能和性能上均有较大优化改进&#xff0c;其中大家期待已久的 CDC Schema evolution&#xff08;DDL 变更同步&#xff09;、主键 Split 拆分、JDBC Sink 自动建表功能、SeaTunnel Zeta …

【给自己挖个坑】三维视频重建(NSR技术)-KIRI Engine

文章目录 以下是我和AI的对话通过手机拍摄物体的视频&#xff0c;再根据视频生成三维模型&#xff0c;这个可实现吗我想开发类似上面的手机应用程序&#xff0c;如何开发呢 看了以上回答&#xff0c;还是洗洗睡吧NSR技术的实现原理是什么呢有案例吗我是名Java工程师&#xff0c…

DNS原理

文章目录 一、域名产生背景域名的树形层次化结构 二、定义三、DNS查询模式递归查询迭代查询 四、主机域名解析工作流程五、H3C配置DNS代理 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、域名 产生背景 在互联网中&#xff0c;通过IP地址访问目标主机…

MySql015——使用子查询

一、创建customers表 ######################## # Create customers table ######################## use study;CREATE TABLE customers (cust_id int NOT NULL AUTO_INCREMENT,cust_name char(50) NOT NULL ,cust_address char(50) NULL ,cust_city char…

计网第四章(网络层)(七)

目录 一、路由信息协议RIP 1.距离向量&#xff1a; 2.跳数&#xff1a; 3.基本工作原理&#xff1a; 三个要点&#xff1a; 4.基本工作过程&#xff1a; &#xff08;1&#xff09;初始状态&#xff1a; &#xff08;2&#xff09;交换并更新信息 &#xff08;3&#…