leetcode刷题第13天二叉树系列之《98 BST及其验证》

98 BST及其验证

BST即二叉binary search tree,二叉搜索树,也有称为是二叉排序树的,当对其使用中序遍历的时候可以得到一个递增的序列。

题目描述

给定一个二叉树,判断其是否是一个有效的二叉搜索树

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。

节点的右子树只包含大于当前节点的数。

所有左子树和右子树自身必须也是二叉搜索树。

示例

输入:

2
/
1 3

输出:true

输入:

​ 5

/ \

1 4

​ / \

​ 3 6

输出:false

解释:根节点的值为5,但是其右子节点的值为4,不满足右子树所有节点的值大于根节点的条件

题目解析

   根据题目提示的深度优先搜索,可以使用递归的方式来写。每次判断左右子树是否满足二叉搜索树的条件即可;

左子树的所有节点的值小于根节点的值

右子树所有节点的值大于根节点的值

  但是这里并不仅仅只是比较根节点和左右节点的值满足条件即可,它是要在整棵二叉树上都满足条件的,因此对于每个节点的取值应该有一个边界范围,例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCymzVOj-1601715451019)(D:\我的博客\刷题\img\leetCode98图示1.png)]

  因此在递归的时候返回false时就不能只是比较左右节点和父亲节点的大小了,具体怎么做也是看了大佬的代码之后才理解的,代码如下:

public boolean isBST(TreeNode root, long min, long max) {
    
    
    if (root == null) {
    
    
        return true;
    }

    if (root.val <= min || root.val >= max) {
    
    
        return false;
    }
    return isBST(root.left, min, root.val) && isBST(root.right, root.val, max);
}

public boolean isValidBST(TreeNode root) {
    
    
    if (root == null) {
    
    
        return true;
    }
    return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}

实现思路如下:

  1. 先使用一个极大值和极小值充当边界的判断条件,确保整颗树的根节点值在这个范围内,这里使用Long类型的最大值是因为自己在代码提交的时候有个测试用例是int类型的最大值,导致错误。

  2. 程序第一进入isBST函数时,对于

    root.val <= min || root.val >= max
    

    该条件的bool值为真。则进入到下面的递归条件中。

  3. 而这个递归也被设置的很简洁,对于左子树的节点,其边界的最小值没有改变,而最大值设置为当前节点的值,即左子树的节点不能比当前节点的值大;对于右子树的节点,其边界的最大值没有改变,而最小值设置为当前节点的值,即右子树的节点不能比当前节点的值小。

  4. 判断条件判断每个节点的范围是否在(min, max),超出该范围则返回false,而边界条件的约束又由递归时候参数传递给出。

程序执行结果:

BST及其验证
参考:小浩算法-BST及其验证

猜你喜欢

转载自blog.csdn.net/weixin_44184990/article/details/108911400