You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 98:验证二叉搜索树代码异常求助——为何判断错误?

二叉搜索树验证代码错误分析与修复

问题根源

你的代码对二叉搜索树(BST)的核心规则理解有误。BST的正确规则是:

  • 任意节点的左子树所有节点值都小于该节点值
  • 任意节点的右子树所有节点值都大于该节点值
  • 更关键的是:每个节点的取值必须处于动态范围内——比如根节点右分支的所有节点,不仅要大于根节点,还要满足所有祖先节点的下限要求;左分支节点则要满足所有祖先节点的上限要求。

你的代码存在两个致命问题:

  1. 仅用当前父节点和根节点的值做判断,没有传递动态的上下限。比如输入里的节点3,它是6的左子节点,你的代码只验证了6>3且根节点5>3就认为合法,但实际上3处于根节点5的右分支,所有右分支节点必须大于5,3不满足这个条件。
  2. 错误地用root.val作为所有子节点的统一判断标准,忽略了每个节点的子节点范围是继承自父节点的动态约束,而非固定和根节点对比。

输入用例的具体错误分析

输入用例的树结构:

5
   / \
  4   6
     / \
    3   7

当处理节点6的左子节点3时,你的代码判断:

  • 6.val > 3.val(6>3,成立)
  • root.val > 3.val(5>3,成立)
    因此将3加入队列,未返回False。但按照BST规则,3处于5的右分支,必须大于5,显然3不满足,你的代码漏掉了这个关键判断。

修复后的BFS版本代码

我们需要在BFS队列中存储每个节点的允许取值范围(下限、上限),子节点的范围由父节点的范围推导而来:

def isValidBST(self, root: Optional[TreeNode]) -> bool:
    if not root:
        return True
    # 队列存储(当前节点, 取值下限, 取值上限)
    queue = [(root, float('-inf'), float('inf'))]
    
    while queue:
        node, lower, upper = queue.pop(0)
        # 先检查当前节点是否在合法范围内
        if node.val <= lower or node.val >= upper:
            return False
        # 左子节点的上限是当前节点值,下限继承父节点的下限
        if node.left:
            queue.append((node.left, lower, node.val))
        # 右子节点的下限是当前节点值,上限继承父节点的上限
        if node.right:
            queue.append((node.right, node.val, upper))
    return True

代码说明

  • 根节点初始范围是(-inf, +inf),无父节点约束
  • 左子节点的取值必须小于父节点值,同时大于父节点的下限
  • 右子节点的取值必须大于父节点值,同时小于父节点的上限
  • 每个节点先校验自身合法性,再处理子节点

用这个代码处理输入用例时,节点3的范围是(5,6)(继承自父节点6的范围(5, +inf)),而3<=5,会直接返回False,符合预期。

内容的提问来源于stack exchange,提问作者confusedgurl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:33:26