zoukankan      html  css  js  c++  java
  • 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'))
  • 相关阅读:
    QTableView表格控件区域选择-自绘选择区域
    Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格
    QRowTable表格控件(三)-效率优化之-合理使用QStandardItem
    QRowTable表格控件(二)-红涨绿跌
    QRowTable表格控件-支持hover整行、checked整行、指定列排序等
    Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
    Asp.net MVC利用Ajax.BeginForm实现bootstrap模态框弹出,并进行前段验证
    Bootstrap:弹出框和提示框效果以及代码展示
    Bootstrap treeview增加或者删除节点
    bootstrap-treeview 如何实现全选父节点下所有子节点及反选
  • 原文地址:https://www.cnblogs.com/George1994/p/7468890.html
Copyright © 2011-2022 走看看