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! 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...
随机推荐
- CentOS 7.9 安装 kafka_2.13
一.CentOS 7.9 安装 kafka_2.13 地址 https://kafka.apache.org/downloads.html 二.安装准备 1 安装JDK 在安装kafka之前必须先安装 ...
- 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):生物信息学中的图表示学习:趋势、方法和应用
4.(2021.6.24)Briefings-生物信息学中的图表示学习:趋势.方法和应用 论文标题: Graph representation learning in bioinformatics: ...
- .Net Core redis 调用报错 '6000 Redis requests per hour' 解决 6000 此调用限制
问题描述 redis 是一种基于内存,性能高效的 NoSQL 数据库,性能高主要就体现在数据交互耗时较短,能够段时快速的对用户的请求做出反应,所以在业务比较复杂或交互量需求大时,必然会超过 6000次 ...
- Redis系列8:Bitmap实现亿万级数据计算
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- HashMap基本使用方法
HashMap Map集合基于 键(key)/值(value)映射.每个键最多只能映射一个值.键可以是任何引用数据类型的值,不可重复:值可以是任何引用数据类型的值,可以重复:键值对存放无序. Hash ...
- Java8新特性:函数式编程
1. 概述 函数式编程学习目的: 能够看懂公司里的代码 大数据量下处理集合效率更高 代码可读性高 消灭嵌套地狱 函数式编程思想: 面向对象思想需要关注用什么对象完成什么事情.而函数式编程思想就类似于我 ...
- webpack 配置echarts 按需加载
引入babel-plugin-equire插件,方便使用.yarn add babel-plugin-equire -D 在.babelrc文件中的配置 { "presets": ...
- Java中String被称为不可变字符串的原因
很多东西,看似可变,实际上不过是是新桃换旧符罢了. 代码: /** * String之所以被称为不可变字符串 */ static void testString(){ String str = &qu ...
- linux ip命令
ip link show # 显示网络接口信息 ip link set eth0 up # 开启网卡 ip link set eth0 down # 关闭网卡 ip link set eth0 pro ...
- <二>自己实现简单的string
我们结合运算符重载知识实现string 类 在自己实现的String类中可以参考C++中string的方法 例如构造,加法,大小比较,长度,[] 等操作. 当前的MyString 类中,暂时不加入迭代 ...