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! 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...
随机推荐
- Servlet(处理乱码,重定向与转发的区别)
//处理请求乱码 req.setCharacterEncoding("utf-8"); //处理响应乱码 resp.setContentType("text/html;c ...
- 记一个深层的bug
1. 业务场景 产品需要每隔几天进行一次组件的更新,在自动化测试中,每隔30s检测一次更新源上的某个文件MD5值是否与本地一致,不一致代表有更新的版本,开始更新. 2. 问题出现 一个再平常不过的繁忙 ...
- django 生产环境部署手册
Django 是 python 的 web 框架,以下是其部署到生产环境的详细步骤,包含 Apache 和 nginx 版本. 部署环境 操作系统:centeros7.3 数据库:MySQL5.6.5 ...
- wpf下的图片放大缩小
WPF下实现图片的放大缩小移动 在windows 7里面有自带的图片查看器,这个软件可以打开一张图片然后以鼠标在图片中的焦点为原点来进行缩放,并且放大后可以随意拖动.下面我们在WPF中实现这个功能 ...
- ATT&CK框架整理(中英文整理)
工作需要了解了一下ATT&CK框架,留个记录.
- Day06:运算符详解
运算符 算术运算符:+,-,*,/,%(取余:也叫模运算),++(自增),--(自减)........... 二次运算符+,-,*,/ int a=10; int b=20; int c=50; in ...
- KubeEdge架构问题汇总
Q1 :KubeEdge云和边的数据协同有什么优势? A : K8s的原生架构中, Node (Kubelet) 是通过List-watch机制主动与Master通信.List-watch机制有几个 ...
- centos8换可用公网yum源
这个咋说呢,总之就是非常简单 百度上找一个公网源替换进去就好 但是就是麻烦,在此做个笔记,也当给大家一个现成的范例 以下为https://vault.centos.org官网源的一个简单的替换脚本,一 ...
- Training: Get Sourced
原题链接:http://www.wechall.net/challenge/training/get_sourced/index.php 提示告诉我们答案就藏在这个界面中,使用View Sourcec ...
- 基于LSM树的存储机制简述
下午听了关于MyRocks-PASV的研究讲座,很有意思所以学习了一下LSM树的一些简单的底层原理.现在整理一下 我们都知道目前Key:Value型的数据库普遍较之关系型数据库有着更好的表现,为什么会 ...