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 
                    
                
                
            
        
浙公网安备 33010602011771号