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
相关产品推荐
相关产品推荐

