98. 验证二叉搜索树
https://leetcode-cn.com/problems/validate-binary-search-tree/
解法一:中序遍历后判断
根据二叉搜索树的性质。中序遍历,将结果记录在data,再遍历data,看是否是升序,是则符合。
边界:树空,或者只有根节点,这两者都不进入循环
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
self.data = []
self.inorder(root)
for i in range(len(self.data)-1):
if self.data[i] >= self.data[i+1]:
return False #不符合升序
return True
def inorder(self, root): #中序遍历
if not root:
return
self.inorder(root.left)
self.data.append(root.val)
self.inorder(root.right)
改进:遍历之后先将data转成set(排除重复项,二叉搜索树中不应该有重复),再排序后与原data比较,若相等则符合
if self.data == sorted(list(set(self.data))):
return True
else:
return False
解法二:遍历中判断
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def helper(root, lower, upper): #参数为根,上界,下界
if not root: #为空不参与比较,返回真
return True
val = root.val
if val <= lower or val >= upper: #超界
return False
#递归左子树
#上界为当前根,下界不变
if not helper(root.left, lower, val):
return False
#递归右子树
#下界为当前根,上界不变
if not helper(root.right, val, upper):
return False
return True #全部通过返回真
#初始根不需要比较
return helper(root, -sys.maxsize, sys.maxsize)
2021.10.22
要在递归中加入上下界参数,将其传递下去比较,否则root比左子大,不一定能保证root比左子的右子大
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def helper(root, lower ,upper):
if root == None:
return True
val = root.val
if val >= upper or val <= lower:
return False
return helper(root.left, lower, val) and helper(root.right, val, upper)
return helper(root, -sys.maxsize, sys.maxsize)
最后更新于