我必须确定是否给出了表示树的列表,树是否是有效的BST(此问题来自leetcode)。我已经看到了其他帖子,但我想知道是否有人可以帮助我的方法,因为它显然是不对的。例如,对于树[1,2,3],其中1是根,2是左子,3是右子,我的代码返回true。希望它只需要很小的改动,但可能是整个函数的方法都不正确。
这是我的代码:
def isValidBST(self, root):
if (root == None):
return True
if (root.left == None or root.left.val < root.val):
return self.isValidBST(root.left)
if (root.right == None or root.right.val > root.val):
return self.isValidBST(root.right)
return False
其次,我已经看到了带有辅助函数的方法,它接受最小/最大值,但这让我感到困惑。如果有人也想解释为什么这种方法是好的/更好的,那将非常感激!
答案 0 :(得分:3)
我为min_max
制作Node
方法,找到以Node
为根的树的最小值和最大值。在找到它们时进行健全性检查,然后isValidBST
可以捕获异常
def max_min(self):
'''
Returns maximum and minimum values of the keys of the tree rooted at self.
Throws an exception if the results are not correct for a BST
'''
l_max, l_min = self.left.max_min() if self.left else (self.val, self.val)
if l_max > self.val:
raise ValueError('Not a BST')
r_max, r_min = self.right.max_min() if self.right else (self.val, self.val)
if r_min < self.val:
raise ValueError('Not a BST')
return l_min, r_max
def isValidBST(self):
try:
if self.max_min():
return True
except ValueError:
return False
答案 1 :(得分:0)
以下是实施有效性检查的一种方法:
class BST:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def isValidBST(self):
'''
Simultaneously check for validity and set our own min and max values.
'''
self.min = self.max = self.value
if self.left:
if not self.left.isValidBST():
return False
if self.left.max >= self.value:
return False
self.min = self.left.min
if self.right:
if not self.right.isValidBST():
return False
if self.right.min < self.value:
return False
self.max = self.right.max
return True
assert BST(2, BST(1), BST(3)).isValidBST()
case = BST(2, BST(1, None, BST(3)))
assert case.left.isValidBST()
assert not case.isValidBST()