98. 验证二叉搜索树

  1. 题目链接

  2. 解题思路:以某个节点为头,是否是搜索二叉树?其实就是问子树要信息

    • 左子树:最大值,最小值,左子树整体是否是搜索二叉树?
    • 右子树:最大值,最小值,右子树整体是否是搜索二叉树
    • 得到信息后,再处理就行,详细处理看代码
  3. 代码

    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
    
posted @ 2024-12-25 15:59  ouyangxx  阅读(23)  评论(0)    收藏  举报