题解 | #判断是不是二叉搜索树#

判断是不是二叉搜索树

https://www.nowcoder.com/practice/a69242b39baf45dea217815c7dedb52b

方法一:前序遍历

在根节点处,判断当前值是否处于(left,right)区间内,

  • 处于区间内,用root.val分别更新为左子树右节点右子树左节点
  • 不处于区间内则返回False
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def isValidBST(self , root: TreeNode) -> bool:
        return self.check(root, float("-inf"), float("inf"))
    
    def check(self, root, left, right):
        if root is None:
            return True
        if left < root.val < right:
            return self.check(root.left, left, root.val) and self.check(root.right, root.val, right)
        else:
            return False

二、中序遍历

  1. 先遍历左子树,设置pre变量
  2. 比较节点值与pre变量大小(pre < root.val)
  3. 变量右子树
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def isValidBST(self , root: TreeNode) -> bool:
        self.pre = None
        return self.traversal(root)
    
    def traversal(self,root):
        if root is None:
            return True
        
        flag = self.traversal(root.left)
        if not flag: return False
        
        if self.pre is None:
            self.pre = root.val
            return self.traversal(root.right)
        else:
            if root.val > self.pre:
                self.pre = root.val
                return self.traversal(root.right)
            else:
                return False

三、后序遍历

  1. 先遍历左子树获取左边的l_min和l_max
  2. 再遍历右子树获取右边的r_min和r_max
  3. 通过比较root.val和l_max和r_min的大小判断其是不是二叉搜索树
class Solution:
    def isValidBST(self , root: TreeNode) -> bool:
        _, l_max = self.traversal(root.left)
        r_min, _ = self.traversal(root.right)
        return l_max < root.val < r_min
    
    def traversal(self,root):
        if root is None:
            return float("inf"), float("-inf")

        l_min, l_max = self.traversal(root.left)
        r_min, r_max = self.traversal(root.right)
        if l_max < root.val < r_min:
            return min(l_min, root.val), max(r_max,root.val) # 因为l_min和r_max一开始是inf和-inf,所以需要用min和max
        else:
            return float("-inf"), float("inf") # 通过返回(-inf,inf),确保后面一定不是二叉搜索树

全部评论

相关推荐

下北澤大天使:你是我见过最美的牛客女孩😍
点赞 评论 收藏
分享
05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务