题目:98. 验证二叉搜索树

题目描述:

给你一个二叉树,让你判断该二叉树是否是二叉搜索树。什么是二叉搜索树呢?就是某一个节点的左子树上的所有节点的值都小于当前节点,右子树上的所有节点值都大于当前节点,记住,是所有节点,不是左子节点和右子节点这俩节点。而且树上所有的节点都必须满足这个条件,整棵树才能是二叉搜索树。

思路:

这道题提供两种思路,第二种也很妙。

1、思路一其实很简单,也很常见。对于二叉搜索树来说,该树的中序遍历一定是一个递增的数组,所以可以在中序遍历的时候判断是否递增就行。实现方式很多,有的是遍历节点的时候将其放到一个数组中,最终看这个数组是否是递增的。有的优化版本,不用数组,直接来一个变量记录上一节点的值,不断比较前一节点和当前节点的大小,都是可以的。

2、思路二是一种拓展模版,就是可以用这种思路解决很多二叉树的问题。思路就是:如果碰到二叉树题中,当前节点需要根据左右子树提供的信息来推导出当前节点的信息,那么就可以使用该思路。比如这道题,验证二叉搜索树,其实就是验证每一个节点是否满足二叉搜索树的节点要求。而满足要求的节点需要满足三个条件:

  • 当前节点要大于左子树上所有节点的最大值
  • 当前节点要小于右子树上所有节点的最小值
  • 当前节点的左右子树都必须是二叉搜索树

所以,从左子树上需要的值就是左子树的最大值和左子树是否是二叉搜索树,从右子树上需要的值就是右子树的最小值和右子树是否是二叉搜索树。两个一合并,从左右子树需要的信息就是最大值、最小值、是否是二叉搜索树

下一步就是根据左右子树提供的这三个信息,推导出当前节点的这三个信息。最大值,可以将左右子树的最大值和当前节点值比较之后得到;最小值同理;当前节点是否是二叉搜索树,可以根据左右子树是否都是二叉搜索树来得到。最终一层层节点,向上提供信息,最终,根节点的信息就推导出来了,是否满足二叉搜索树,自然而然就出来了!

这种思路用来解决这一题,可能没有中序遍历那么简单。但是这种思路可以解决很多二叉树的问题,是一种模版思想,这是很珍贵的一点。如果碰到二叉树题中,当前节点需要根据左右子树提供的信息来推导出当前节点的信息,那么就可以使用该思路。 碰到不知道怎么解决的二叉树题,可以思路往这上面靠拢,或许就有思路了。

步骤:

1、构建从左右子树需要的信息。创建一个Info类,里面包含,最大值、最小值、是否是二叉搜索树

2、递归方法中,先去获取左子树和右子树的Info信息,拿到之后,开始构建当前节点的Info信息。

3、递归方法完毕,返回根节点的Info信息,返回信息中的是否是二叉搜索树属性即可。

代码:

思路一的代码:

    // 用来记录前一个节点
TreeNode pre;
public boolean isValidBST2(TreeNode root) {
if (root == null) return true; // 左
boolean left = isValidBST2(root.left); // 中
// 如果不递增了
if (pre != null && pre.val >= root.val) return false;
pre = root; // 右
boolean right = isValidBST2(root.right); return left && right;
}

思路二的代码:

    public boolean isValidBST(TreeNode root) {
return process(root).isBST;
} public Info process(TreeNode node) {
if (node == null) return null; // 从左右子树中获取信息
Info leftInfo = process(node.left);
Info rightInfo = process(node.right); boolean isBST = true;
int min = node.val;
int max = node.val; // 构建当前节点的信息
if (leftInfo != null) {
max = Math.max(leftInfo.max, max);
min = Math.min(leftInfo.min, min); if (!leftInfo.isBST || leftInfo.max >= node.val) {
isBST = false;
}
}
if (rightInfo != null) {
max = Math.max(rightInfo.max, max);
min = Math.min(rightInfo.min, min); if (!rightInfo.isBST || rightInfo.min <= node.val) {
isBST = false;
}
} return new Info(isBST, min, max);
} class Info {
boolean isBST;
int min;
int max; public Info(boolean isBST, int min, int max) {
this.isBST = isBST;
this.min = min;
this.max = max;
}
}

LeetCode HOT 100:验证二叉搜索树(从左右子树获取信息进行推导)的更多相关文章

  1. 【LeetCode】98. 验证二叉搜索树

    98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...

  2. Leetcode题目98.验证二叉搜索树(递归-中等)

    题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是 ...

  3. 98. 验证二叉搜索树 前序遍历解法以及后续遍历解法(go语言)

    leetcode题目 98. 验证二叉搜索树 前序遍历 最简洁的答案版本,由于先判断的是根节点,所以直接判断当前root的值v,是否满足大于左子树最大,小于右子树最小,然后再遍历左子树,右子树是否是这 ...

  4. [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...

  5. [LeetCode] Validate Binary Search Tree 验证二叉搜索树

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  6. LeetCode:验证二叉搜索树【98】

    LeetCode:验证二叉搜索树[98] 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当 ...

  7. LeetCode初级算法--树02:验证二叉搜索树

    LeetCode初级算法--树02:验证二叉搜索树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  8. [LeetCode] 255. Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...

  9. [LeetCode] 98. Validate Binary Search Tree 验证二叉搜索树

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  10. LeetCode(98): 验证二叉搜索树

    Medium! 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...

随机推荐

  1. 大数据技术之HBase原理与实战归纳分享-中

    @ 目录 底层原理 Master架构 RegionServer架构 Region/Store/StoreFile/Hfile之间的关系 写流程 写缓存刷写 读流程 文件合并 分区 JAVA API编程 ...

  2. Mapper 实体转换Entiy to Dto

    实际使用中发现很多问题 如果用EFcore 框架,这个表达式树生成一个新的实体导致EFcore 跟踪失败!/// <summary> /// 生成表达式目录树 泛型缓存 /// </ ...

  3. Pep9课下作业

    (1)编写一个伪代码算法 Set sum to 0 Input num1 Read num1 Set sum to sum + num1 Input num2 Read num2 Set sum to ...

  4. capability参数配置

    前言 本文为在霍格沃兹测试开发学社的学习经历分享 简介 功能:配置 Appium 会话,告诉 Appium 服务器需要自动化的平台的应用程序 形式:键值对的集合,键对应设置的名称,值对应设置的值 主要 ...

  5. Linux进程间通信(一)

    进程间通信 概念:进程是一个独立的资源分配单位,不同进程之间有关联,不能在一个进程中直接访问另一个进程的资源. 进程和进程之间的资源是相互独立的,一个进程不能直接访问另外一个进程的资源,但是进程和进程 ...

  6. git pull与git pull --rebase

    aliases: [] tags: [git] link: date: 2022-08-30 目录 git pull --rebase 等效命令 总结 参考文章 git pull --rebase 在 ...

  7. DTSE Tech Talk | 第10期:云会议带你入门音视频世界

    摘要:本期直播主题是<云会议带你入门音视频世界>,华为云媒体服务产品部资深专家金云飞,与开发者们交流华为云会议在实时音视频行业中的集成应用,帮助开发者更好的理解华为云会议及其开放能力. 本 ...

  8. EntityFramework介绍

    首先我们说明一下ORM是什么. 微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上.开发人员使用Linq语言,对数据库操作如同操作Object对象 一 ...

  9. vue3 结合 element-plus 框架实现增删改查功能(不连接数据库)

    一.效果图 二.代码 2.1.导入依赖(已经安装过node.js) npm install element-plus --save 注意:要是安装失败,可以使用淘宝镜像进行下载,如下: 2.2.设置淘 ...

  10. 大前端html基础学习02

    CSS核心属性 一.css属性和属性值的定义 属性:属性是指定选择符所具有的属性,它是css的核心. 属性值:属性值包括法定属性值及常见的数值加单位,如25px,或颜色值等. 二.CSS文本属性 1. ...