98. 验证二叉搜索树
-
解题思路:以某个节点为头,是否是搜索二叉树?其实就是问子树要信息
- 左子树:最大值,最小值,左子树整体是否是搜索二叉树?
- 右子树:最大值,最小值,右子树整体是否是搜索二叉树
- 得到信息后,再处理就行,详细处理看代码
-
代码
class Solution: class Info: def __init__(self, tmp_max, tmp_min, tmp_isSearch): self.node_max = tmp_max self.node_min = tmp_min self.isSearch = tmp_isSearch def process(self, node: Optional[TreeNode]) -> Info: node_max = node.val node_min = node.val isSearch = True left_info = None right_info = None if node.left: left_info = self.process(node.left) if node.right: right_info = self.process(node.right) if left_info and right_info: # 都不为空 if left_info.isSearch == False or right_info.isSearch == False: # 任意一棵树不是搜索二叉树 isSearch = False node_max = max(node_max, left_info.node_max, right_info.node_max) node_min = min(node_min, left_info.node_min, right_info.node_min) elif node_max <= left_info.node_max or node_max >= right_info.node_min: # 该节点的值小于左子树最大值 或者 大于右节点最小值 isSearch = False node_max = max(node_max, left_info.node_max, right_info.node_max) node_min = min(node_min, left_info.node_min, right_info.node_min) else: node_max = max(node_max, left_info.node_max, right_info.node_max) node_min = min(node_min, left_info.node_min, right_info.node_min) elif left_info: # 右子树为空 if left_info.isSearch == False: isSearch = False node_max = max(node_max, left_info.node_max) node_min = min(node_min, left_info.node_min) elif node_max <= left_info.node_max: isSearch = False node_max = max(node_max, left_info.node_max) node_min = min(node_min, left_info.node_min) else: node_max = max(node_max, left_info.node_max) node_min = min(node_min, left_info.node_min) elif right_info: # 左子树为空 if right_info.isSearch == False: isSearch = False node_max = max(node_max, right_info.node_max) node_min = min(node_min, right_info.node_min) elif node_max >= right_info.node_min: isSearch = False node_max = max(node_max, right_info.node_max) node_min = min(node_min, right_info.node_min) else: node_max = max(node_max, right_info.node_max) node_min = min(node_min, right_info.node_min) return self.Info(node_max, node_min, isSearch) def isValidBST(self, root: Optional[TreeNode]) -> bool: if root == None: return True ans = self.process(root) return ans.isSearch
标签:
leetcode刷题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理