LeetCode HOT 100:验证二叉搜索树(从左右子树获取信息进行推导)
题目: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:验证二叉搜索树(从左右子树获取信息进行推导)的更多相关文章
- 【LeetCode】98. 验证二叉搜索树
98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...
- Leetcode题目98.验证二叉搜索树(递归-中等)
题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是 ...
- 98. 验证二叉搜索树 前序遍历解法以及后续遍历解法(go语言)
leetcode题目 98. 验证二叉搜索树 前序遍历 最简洁的答案版本,由于先判断的是根节点,所以直接判断当前root的值v,是否满足大于左子树最大,小于右子树最小,然后再遍历左子树,右子树是否是这 ...
- [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 ...
- [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 ...
- LeetCode:验证二叉搜索树【98】
LeetCode:验证二叉搜索树[98] 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当 ...
- LeetCode初级算法--树02:验证二叉搜索树
LeetCode初级算法--树02:验证二叉搜索树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- [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 ...
- [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 ...
- LeetCode(98): 验证二叉搜索树
Medium! 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...
随机推荐
- Filter 筛选器(一)之 ActionFilter-- IAsyncActionFilter 和 ActionFilterAttribute
微软官网例子:Filter筛选器 使用场景(执行顺序): IAsyncActionFilter 使用异步actionFilter 只需要实现 他的 :OnActionExecutionAsync 方法 ...
- hwj是猪
黄伟佳不爱我了吧唧吧唧
- Vue3 SFC 和 TSX 方式自定义组件实现 v-model
1 v-model 1.1 理解 v-model v-model 是 vue3 中的一个内置指令,很多表单元素都可以使用这个属性,如 input.checkbox 等,咱可以在自定义组件中实现 v-m ...
- Dubbo-聊聊注册中心的设计
前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrap ...
- 文本挖掘与NLP笔记——代码向:分词
分词:jieba.cut words = jieba.cut("我来到北京大学",cut_all=True) print('全模式:'+'/'.join([w for w in w ...
- 记录在linux上单机elasticsearch8和kibana8
目录 1.背景 2.es对jdk和操作系统的要求等 3.安装步骤 3.1 下载对应版本的es 3.2 创建es账户 3.3 修改es配置 3.3.1 修改es配置 3.3.3 修改jvm配置 3.4 ...
- MyBatis笔记03------XXXMapper.xml文件解析
SQL映射文件的配置解析 当我们写好mapper(dao)层接口时,然后在对应的XXXMapper.xml文件中写业务逻辑对应的SQL映射语句,通过这个文件中可以实现CRU操作,那么下面说明如何编写这 ...
- OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py
摘要:本文介绍了build lite 轻量级编译构建系统hb命令的源码,主要分析了_\entry__.py文件. 本文分享自华为云社区<移植案例与原理 - build lite源码分析 之 hb ...
- 微信小程序canvas 证件照制作
小程序制作证件照过程 利用canvas制作生活中常用的证件照,压缩图片,修改图片dpi.希望给大家带来方便. 证件照小程序制作要点 上传合适的图片,方便制作证件照 调用AI接口,将图像进行人像分割.这 ...
- 2022春每日一题:Day 31
题目:机器分配 设f[i][j]表示前i个机器,共分配了j个的最大值,枚举第i个机器分配个数,转移f[i][j]=max{f[i-1][k]+a[i][j-k]},此题只是加了个要输出 代码: #in ...