• 98. 验证二叉搜索树


    98. 验证二叉搜索树

    题意

    判断二叉树是否是BST,要求不能出现等于的情况,也就是左子树必须比结点小,右子树必须比结点大。

    解题思路

    如果对于BST的理解没有那么到位的话,可能就会写出下面的代码:

    class Solution:
       def isValidBST(self, root):
           """
          :type root: TreeNode
          :rtype: bool
          """
           if not root:
               return True

           if root.left and root.left.val >= root.val:
               return False

           if root.right and root.right.val <= root.val:
               return False

           return self.isValidBST(root.left) and self.isValidBST(root.right)

    这么会存在一个问题,上面仅仅是判断了当前结点和左右子树的值,则没有考虑到祖父结点和父亲结点和子结点的值的比较,比如:

    所以应该是将上一个结点和当前访问的结点进行比较;

    正确的思路如下:

    • 利用中序遍历的思想,将其转为数组,判断是否有序即可;

    • 同样利用中序遍历的思想,维护一个变量来记录当前结点的前一个访问的结点(数组的最后一个值作为最新访问的值)保证当前结点比前一个访问的结点要大即可;

    • 控制区间的思想,保证当前树的值的范围在对应的区间即可,如下:

    实现

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None

    class Solution(object):
       def isValidBST(self, root):
           """
          :type root: TreeNode
          :rtype: bool
          """
           def dfs(node):
               if not node:
                   return
               
               # 加入到数组中后面利用排序进行比较
               dfs(node.left)
               nums.append(node.val)
               dfs(node.right)
               
           if not root:
               return True
           
           nums = []
           dfs(root)
           return len(set(nums)) == len(nums) and sorted(nums) == nums
       
    def isValidBST(self, root):
           """
          :type root: TreeNode
          :rtype: bool
          """
           def dfs(node, path):
               if not node:
                   return True
               
               if not dfs(node.left, path):
                   return False
               # 和前一个访问的结点的值进行比较,保证当前结点值比前一个结点的值要大;
               # 利用数组来维护上次访问的值
               if path and node.val <= path[-1]:
                   return False
               path.append(node.val)
               
               return dfs(node.right, path)
               
           if not root:
               return True
           nums = []
           return dfs(root, nums)
         
    last_visit_node = None
       def isValidBST(self, root):
           """
          :type root: TreeNode
          :rtype: bool
          """

           def dfs(node):
               if not node:
                   return True

               if not dfs(node.left):
                   return False

               # 和前一个访问的结点的值进行比较,保证当前结点值比前一个结点的值要大;
               # 利用类变量来维护上次访问的值
               if self.last_visit_node and node.val <= self.last_visit_node.val:
                   return False
               self.last_visit_node = node
               return dfs(node.right)

           if not root:
               return True
           return dfs(root)
       
    def isValidBST(self, root):
           """
          :type root: TreeNode
          :rtype: bool
          """
           def helper(node, lo, hi):
               if node == None:
                   return True
               # 如果访问左结点,则设置最大值为当前结点的值,如果访问右结点,则设置最小值为当前结点的值;
               return lo < node.val < hi and
                      helper(node.left, lo, node.val) and
                      helper(node.right, node.val, hi)
           return helper(root, float('-Inf'), float('Inf'))
  • 相关阅读:
    《Python》进程收尾线程初识
    《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池
    L02-RHEL6.5环境中安装JDK1.8
    L01-RHEL6.5中部署NTP(ntp server + client)
    P01-Python中列表的复制问题
    数据库模式(三级模式+两级映射)
    事务的四大性质:ACID
    JAVA_接口_默认方法&静态方法
    2018年最新Java面试题及答案整理
    Socket通信原理
  • 原文地址:https://www.cnblogs.com/George1994/p/7468890.html
Copyright © 2020-2023  润新知