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

LeetCode 98题:验证二叉搜索树代码异常求排查思路

LeetCode 98 验证二叉搜索树:代码错误分析与修正

核心逻辑错误

你的代码在判断左右子树与当前节点的合法性时,存在关键逻辑错误:

  • 对于左子树,二叉搜索树要求左子树所有节点值必须小于当前节点值,因此需要验证左子树的最大值是否小于当前节点值。但你代码中错误地用了左子树的最小值和当前节点比较(left.min >= node.val),这一判断完全无效,会导致合法的左子树被误判。
  • 对于右子树,二叉搜索树要求右子树所有节点值必须大于当前节点值,因此需要验证右子树的最小值是否大于当前节点值。但你代码中写的是right.min <= node.val,这会把合法的右子树判定为非法。

次要问题:空节点处理

原代码中空节点返回null,需要频繁进行null检查,可优化为返回一个特殊的ReturnData实例(最小值设为极大值,最大值设为极小值),简化后续的min/max计算逻辑。

修正后的代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {

    static class ReturnData {
        public boolean isBST;
        public int max;
        public int min;
        public ReturnData(boolean is, int mi, int ma) {
            isBST = is;
            min = mi;
            max = ma;
        }
    }

    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        ReturnData res = check(root);
        return res.isBST;
    }

    private ReturnData check(TreeNode node) {
        if (node == null) {
            // 空节点标记为合法BST,极值设置不影响父节点的min/max计算
            return new ReturnData(true, Integer.MAX_VALUE, Integer.MIN_VALUE);
        }

        int min = node.val;
        int max = node.val;
        ReturnData left = check(node.left);
        ReturnData right = check(node.right);

        // 更新当前子树的最小、最大值
        min = Math.min(min, left.min);
        max = Math.max(max, left.max);
        min = Math.min(min, right.min);
        max = Math.max(max, right.max);
        
        boolean isBST = true;
        // 左子树非法,或左子树最大值 >= 当前节点值 → 当前子树非法
        if (!left.isBST || left.max >= node.val) {
            isBST = false;
        }
        // 右子树非法,或右子树最小值 <= 当前节点值 → 当前子树非法
        if (!right.isBST || right.min <= node.val) {
            isBST = false;
        }
        
        return new ReturnData(isBST, min, max);
    }
}

极端数值优化

如果需要覆盖节点值为Integer.MIN_VALUE或Integer.MAX_VALUE的测试用例,可将ReturnData中的min和max改为long类型,避免数值溢出:

static class ReturnData {
    public boolean isBST;
    public long max;
    public long min;
    public ReturnData(boolean is, long mi, long ma) {
        isBST = is;
        min = mi;
        max = ma;
    }
}

// 对应check方法中的初始化与空节点返回:
long min = node.val;
long max = node.val;
// ...
return new ReturnData(true, Long.MAX_VALUE, Long.MIN_VALUE);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:10:33