繁体   English   中英

Leetcode 使用 BFS 和迭代验证二叉搜索树

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM