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