繁体   English   中英

LeetCode 98:验证二叉搜索树

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

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