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! 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...
随机推荐
- 谣言检测(DUCK)《DUCK: Rumour Detection on Social Media by Modelling User and Comment Propagation Networks》
论文信息 论文标题:DUCK: Rumour Detection on Social Media by Modelling User and Comment Propagation Networks论 ...
- 通过QQ抓IP查询地址
使用工具: Wireshark 可以直接搜索官网获取,个人用的免费的,也可以直接在kali中也是可以直接用的.这里就不介绍怎么安装了,网上很多. 步入正题: 通过wireshark进行抓包查地址,需要 ...
- Flink WordCount入门
下面通过一个单词统计的案例,快速上手应用 Flink,进行流处理(Streaming)和批处理(Batch) 单词统计(批处理) 引入依赖 <!--flink核心包--> <depe ...
- web share api 分享
概述 Navigator.share() 方法通过调用本机的共享机制作为 Web Share API 的一部分.如果不支持 Web Share API,则此方法为 undefined. 此项功能仅在 ...
- VS code 如何使用HTML Boilerplate插件
此插件是一个HTML 模版插件,可以摆脱为 HTML 新文件重新编写头部和正文标签的苦恼. 只需在空文件中输入 html,并按 tab 键,即可生成干净的文档结构.也可以输入!,然后按tab键或者en ...
- 一篇文章带你了解服务器操作系统——Linux简单入门
一篇文章带你了解服务器操作系统--Linux简单入门 Linux作为服务器的常用操作系统,身为工作人员自然是要有所了解的 在本篇中我们会简单介绍Linux的特点,安装,相关指令使用以及内部程序的安装等 ...
- 洛P8109题解
摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p8109 本题原题目摘录: 本场比赛共有 \(n\) 道题,Ci ...
- CSS选择器大全48式
00.CSS选择器 CSS的选择器分类如下图,其中最最常用的就是基础选择器中的三种:元素选择器.类选择器.id选择器.伪类选择器就是元素的不同行为.状态,或逻辑.然后不同的选择器组合,基于不同的组合关 ...
- python学习——查找计算机中的文件
# import os # # path = 'C:/Users/admin/Desktop/images' # files = os.listdir(path) # # for f in files ...
- 【Devexpress】pivotGridControl设置不显示展开折叠按钮
只需要设置.效果看图二