98. 验证二叉搜索树 Python


一、题目描述

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

有效 二叉搜索树定义如下:

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

示例 1

在这里插入图片描述

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

示例 2

在这里插入图片描述

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

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

二、代码

代码如下:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
import math
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        # 定义无穷大与无穷小
        Minimum = -math.pow(2,31) - 1
        Maximum = math.pow(2,31) 
        result = [True]
        def judgement(root,min,max):
            # 如果当前的根节点值在区间范围内则继续判断其左、右子树,并更新范围
            if min < root.val and root.val < max:
                if root.left:
                    # 当前节点存在左子树,则缩小上限为当前节点值,下限不变
                    judgement(root.left,min,root.val)
                if root.right:
                    # 当前节点存右子树,则缩小下限为当前节点值,上限不变
                    judgement(root.right,root.val,max) 
            else:
                # 如果当前节点值不在范围内,则结束当前进程,并认定该树不为二叉搜索树
                result[0] = False
                return
        if root.left == None and root.right == None: #左右子树都为空时
            return result[0]
        if root.left and root.right == None: #左子树不为空,右子树为空
            judgement(root.left,Minimum,root.val)
        if root.left == None and root.right: #左子树为空,右子树不为空
            judgement(root.right,root.val,Maximum)
        if root.left and root.right: # 左右子树都不为空
            judgement(root.left,Minimum,root.val)
            judgement(root.right,root.val,Maximum)
        return result[0]

三、解题思路

本题主要考察二叉搜索树的定义,需要对二叉搜索树的性质有一定理解,关于二叉搜索树的性质题目要求中已经给出,本题解不再赘述,下面来说一下本题的解题思路,以具体的二叉树为例:
在这里插入图片描述我们想要判断这个数是否是二叉搜索树,则需要判断每一个节点是否满足条件,我们可以通过先看一下二叉树各个位置上的范围:
在这里插入图片描述
到这里就能很直观的看出来,每一个节点对应的位置的范围,如果该结点的值在这一范围内,则满足二叉搜索树的条件,反之则不满足。
如何判断当前节点的值所处范围是多少,很明显,通过示例图所示,分为两种情况:
①如果当前节点是上一个节点的左节点(即当前节点位于其父节点的左子树中),则其范围是:
[父节点范围的下限,父节点的值]
②如果当前节点是上一个节点的右节点(即当前节点位于其父节点的右子树中),则其范围是:
[父节点的值,父节点范围的上限]
我们只需要遍历二叉树每一个节点,每次更新当前节点对应的范围,然后判断当前节点的值是否位于该范围,就可以知道其是否满足二叉搜索树条件。
需要注意的是:
①题目要求中所提出,任意结点的值的范围是[-231,231-1],我们则需要设置一个超出这个范围的值作为-∞和+∞(本题以-231-1作为负无穷大;以231作为正无穷大)。
②所有的区间范围都应该是开区间,因为二叉搜索树中不应该存在重复的数值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值