[英]Leetcode Validate Binary Search Tree using BFS and Iteration
我正在尝试解决 leetcode 问题以使用 BFS 验证 BST,虽然它通过了一些测试用例,但我遇到了特定测试用例的问题。
Test Case:
[5,4,6,null,null,3,7]
stout:
TreeNode{val: 5, left: TreeNode{val: 4, left: None, right: None}, right: TreeNode{val: 6, left: TreeNode{val: 3, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}}
树
5
/ \
4 6
/ \ / \
None None 3 7
我下面的代码返回 True,而它应该是 False。 我已经使用二叉搜索树数据结构在本地进行了调试,但在我的逻辑中找不到缺陷。 我知道所有大于根的节点都应该在右边,所有小于根的节点都在左边。 因此我的条件:
current_node.left.val >= root.val
用于检查,但似乎没有这样做。 请帮助我理解逻辑错误。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
current_node = root
print(current_node)
queue = [current_node]
while len(queue) > 0:
current_node = queue.pop(0)
if current_node.left:
if current_node.left.val >= current_node.val and current_node.left.val >= root.val:
return False
queue.append(current_node.left)
if current_node.right:
if current_node.right.val <= current_node.val and current_node.right.val <= root.val:
return False
queue.append(current_node.right)
return True
我知道所有大于根的节点都应该在右边,所有小于根的节点都在左边。 因此我的条件
current_node.left.val >= root.val
您对约束的描述是正确的,但代码并没有按照您的描述进行。 您的代码确保直接孩子遵守此约束,但不是“所有节点”。
所以在示例树中:
5
/ \
4 6
/ \ / \
None None 3 7
...您的代码确保 6 > 5 和(在更深层次上)3 < 6,但它不能确保 3 > 5(这是不正确的,并且足以将树拒绝为 BST)。 请注意,具有这些值的节点不在父子关系中,但您仍然需要检查这一点。
有两种常见的方法来实现这种更彻底的检查:
执行中序遍历并确保按升序遍历值
执行前序遍历并将有效范围(最小值/最大值)传递给递归调用。 每次调用都会检查当前节点是否具有这两个极值中的值。
我会把它留给你来实现它。 这个网站上有很多问答,都有正确的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.