[英]LeetCode 98: Validate Binary Search Tree
我已经逐行查看了这段代码可能 100 次,我被难住了。 为什么这不起作用????
问题:[5,4,6,null,null,3,7] 的输入(这是一个 BST,其中 5 是根节点,4 和 6 是它的左右节点)在应该返回 False 时返回 True(3 应该不在父节点的右边 5)。 False 应该在 while 循环中的第一个嵌套 if 语句处返回。
def isValidBST(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
# BFS method
current_node = root
queue = []
queue.append(current_node)
while len(queue) > 0:
current_node = queue.pop(0)
if current_node.left:
if (current_node.val > current_node.left.val) and (root.val > current_node.left.val):
queue.append(current_node.left)
else:
return False
if current_node.right:
if (current_node.val < current_node.right.val) and (root.val < current_node.right.val):
queue.append(current_node.right)
else:
return False
return True
您的代码失败的树是:
5
/ \
4 6
/ \
3 7
当current_node
为 6 时,您的代码会检查root.val > current_node.left.val
,这意味着它会检查 5 > 3。这是真的。 所以它错误地断定那里没有问题,但确实存在。
您现在可能只想更改比较的方向,但您的方法存在逻辑错误:将根与其子树中的每个节点进行比较是不够的。 例如,在以下树中,您应该检测到 3 违反了 BST 属性,即使它与根不冲突:
2
\
5
\
6
/
3
冲突在于值 5,它既不是 3 的父节点,也不是根节点。
总之,BFS 遍历并不是验证 BST 的理想工具。 虽然肯定可以做到,但使用 DFS 更自然,因为它允许降低适用于子树中每个节点的(累积的)限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.