zoukankan      html  css  js  c++  java
  • leetcode98 Validate Binary Search Tree

      1 """
      2 Given a binary tree, determine if it is a valid binary search tree (BST).
      3 Assume a BST is defined as follows:
      4     The left subtree of a node contains only nodes with keys less than the node's key.
      5     The right subtree of a node contains only nodes with keys greater than the node's key.
      6     Both the left and right subtrees must also be binary search trees.
      7 Example 1:
      8     2
      9    / 
     10   1   3
     11 Input: [2,1,3]
     12 Output: true
     13 Example 2:
     14     5
     15    / 
     16   1   4
     17      / 
     18     3   6
     19 Input: [5,1,4,null,null,3,6]
     20 Output: false
     21 Explanation: The root node's value is 5 but its right child's value is 4.
     22 """
     23 """
     24 好题,提供四种解法,可与leetcode1305结合起来看https://www.cnblogs.com/yawenw/p/12284717.html
     25 解法一:自己AC 中序遍历(递归) + sorted() + set()
     26 思路是将二叉搜索树中序遍历存入nums
     27 先set()处理,将输入为[1, 1]的情况排除
     28 再sorted()与nums比较是否相等
     29 因为如果为二叉搜索树 nums应该是没有重复值并且递增的
     30 """
     31 class TreeNode:
     32     def __init__(self, x):
     33         self.val = x
     34         self.left = None
     35         self.right = None
     36 
     37 class Solution:
     38     def isValidBST(self, root: TreeNode) -> bool:
     39         if not root:
     40             return True  # bug input为[]时
     41         res = self._inorder(root, [])
     42         return res == sorted(set(res))  # bug 加上set是为了判断input[1,1]
     43 
     44     def _inorder(self, root, nums):
     45         if root.left:
     46             self._inorder(root.left, nums)
     47         nums.append(root.val)
     48         if root.right:
     49             self._inorder(root.right, nums)
     50         return nums
     51 """
     52 解法二:递归
     53 关键点在于初始化的时候
     54 用无穷大和无穷小作为根结点的上下值
     55 """
     56 class Solution2:
     57     def isValidBST(self, root):
     58 
     59         return self._isValidBST(root)
     60 
     61     def _isValidBST(self, root, low=float('-inf'), high=float('inf')): # !!!关键的初始化
     62         if not root:
     63             return True
     64         value = root.val
     65         if not low < value < high:
     66             return False
     67         return self._isValidBST(root.left, low, value) and 
     68                self._isValidBST(root.right, value, high)
     69 """
     70 解法三:将解法一的递归中序遍历变为栈
     71 """
     72 class Solution3:
     73     def isValidBST(self, root):
     74         stack = []
     75         inorder = []
     76         if not root:
     77             return True
     78         while stack or root: #非递归中序遍历
     79             while root:
     80                 stack.append(root)
     81                 root = root.left
     82             root = stack.pop() #bug这里写了 x = stack.pop(),影响上面while循环
     83             inorder.append(root.val)
     84             root = root.right #bug 这里写成了stack.append(root.right),原因没理解
     85         return inorder == sorted(set(inorder))
     86 """
     87 解法四:将解法二的递归变为迭代(queue)
     88 """
     89 class Solution4:
     90     def isValidBST(self, root):
     91         if not root:
     92             return True
     93         queue = [(root, float('-inf'), float('inf'))]
     94         while queue:
     95             root, low, high = queue.pop(0)
     96             value = root.val
     97             if not low < value < high:
     98                 return False
     99             if root.left: #if判别不能少
    100                 queue.append((root.left, low, value))
    101             if root.right:
    102                 queue.append((root.right, value, high))
    103         return True
  • 相关阅读:
    aspx页面,中文乱码解决方案
    使用JSP体验微信公众平台开发模式
    使用微信公众平台“编辑模式”的过程记录
    JAVA刷新网站IP访问量的技术探讨
    301. Remove Invalid Parentheses
    Dungeon Game
    刷题关键点总结-动态规划
    刷题关键点总结-单调栈、单调队列
    coin change
    常用vim命令
  • 原文地址:https://www.cnblogs.com/yawenw/p/12376942.html
Copyright © 2011-2022 走看看