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

判断是不是二叉搜索树

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),确保后面一定不是二叉搜索树

全部评论

相关推荐

找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 14:23
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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