首页 > 其他分享 >图解LeetCode——98. 验证二叉搜索树

图解LeetCode——98. 验证二叉搜索树

时间:2023-06-01 13:31:55浏览次数:46  
标签:遍历 TreeNode val LeetCode 98 二叉 root 节点

一、题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树

二、示例

2.1> 示例 1:

输入】root = [2,1,3] 【输出】true

2.2> 示例 2:

输入】root = [5,1,4,null,null,3,6] 【输出】false 【解释】根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在 [1, 10^4]
  • -2^31 <= Node.val <= 2^31 - 1

三、解题思路

根据题目描述,要去验证给定的二叉树是不是二叉搜索树。那么题目中给出了非常关键的一个信息就是——二叉搜索树,那么这种二叉树具有如下的特征:

若它的左子树不空】则左子树上所有结点的值均小于它的根结点的值; 【若它的右子树不空】则右子树上所有结点的值均大于它的根结点的值;

针对这道题,我们其实可以通过中序遍历的方式进行解题。为什么是中序遍历呢?首先我们要先了解二叉树的遍历方式。我们以三个节点为例:nodeleftNoderightNode。遍历方式如下所示:

前序遍历node——>leftNode——>rightNode中序遍历leftNode——>node——>rightNode后序遍历leftNode——>rightNode——>node

那么针对中序遍历,是先遍历左节点,然后是根节点,最后才是右节点;那么如果这个二叉树是二叉搜索树,遍历出来的每个节点的值的最终集合结果就是一个升序排列。所以,针对这个特性,我们就可以首先创建一个val变量,用于保存当前遍历的前一个节点值,然后每当遍历到一个节点node的时候,如果不满足node.val > val,则表示不是二叉搜索树了

以上就是本题的解题思路了,为了便于大家理解,我们以输入root = [5,1,4,null,null,3,6]为例,看一下具体的判断流程。请见下图所示:

四、代码实现

class Solution {
    public long val = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if (root == null) return true;
        if (!isValidBST(root.left)) return false;
        if (val >= root.val) return false;
        val = root.val;
        return isValidBST(root.right);
    }
}
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, Tre eNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:遍历,TreeNode,val,LeetCode,98,二叉,root,节点
From: https://blog.51cto.com/u_15003301/6393435

相关文章

  • LeetCode/叶值的最小代价生成树
    给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:每个节点都有0个或是2个子节点。数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。在所有这样的二叉树中,返回每个非叶节点的值的最小可能总......
  • LeetCode 96.不同的二叉搜索树
    1.题目:给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。示例1:输入:n=3输出:5示例2:输入:n=1输出:1来源:力扣(LeetCode)链接:https://leetcode.cn/problems/unique-binary-search-trees著作权归领扣网络所有......
  • LeetCode 343.整数拆分
    1.题目:给定一个正整数 n ,将其拆分为k个正整数的和( k>=2 ),并使这些整数的乘积最大化。返回你可以获得的最大乘积 。示例1:输入:n=2输出:1解释:2=1+1,1×1=1。示例 2:输入:n=10输出:36解释:10=3+3+4,3× 3× 4=36。来源:力扣(LeetCo......
  • 图解LeetCode——102. 二叉树的层序遍历
    一、题目给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。二、示例2.1>示例1:【输入】root=[3,9,20,null,null,15,7]【输出】[[3],[9,20],[15,7]]2.2>示例2:【输入】root=[1]【输出】[[1]]2.3>示例3:【输入】root=[]......
  • [leetcode每日一题]5.31
    1130. 叶值的最小代价生成树提示中等324相关企业给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:每个节点都有 0 个或是 2 个子节点。数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。在所有这......
  • 二刷Leetcode-Days08
    栈与队列:/***20.有效的括号*@params*@return*/publicbooleanisValid(Strings){Deque<Character>deque=newLinkedList<>();for(inti=0;i<s.length();i++){charch=s.charAt......
  • 图解LeetCode——146. LRU 缓存
    一、题目请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intva......
  • dfs 二叉树中序遍历迭代解法——求解BST中第k小元素
    BST中第K小的元素中文English给一棵二叉搜索树,写一个 KthSmallest 函数来找到其中第K小的元素。Example样例1:输入:{1,#,2},2输出:2解释: 1 \ 2第二小的元素是2。样例2:输入:{2,1,3},1输出:1解释:2/\13第一小的元素是1。Challenge如果这棵BST经常会被修改(......
  • leetcode
    1python常用函数1.1排序函数原地排序nums.sort()不改变原列表有返回值new=sorted(nums)importfunctools#一维数组排序nums=[2,1,3,4,5]defcompare_udf(x,y):#x-y升序#y-x降序returnx-y##python2nums.sort(cmp=compar......
  • 区块链的技术——账本是去中心化的分布式存储,加密+校验(哈希二叉树)+多数选举来防止篡改
    ......