二叉树——验证二叉搜索树

题目如下:
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含严格小于 当前节点的数。
节点的右子树只包含严格大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

方法:递归+上下界
思路:

  1. 给每个节点规定一个取值范围(low,high)
  2. 根节点:-∞ <root< +∞
  3. 左孩子:继承父节点的low,上限变成父节点值
  4. 右孩子:继承父节点的high,下限变成父节点值
  5. 节点不在范围内->不是BST

完整代码实现如下:

public class ValidateBST {

public boolean isValidBST(TreeNode root) {
// 初始:根节点无上下限(用 long 防止 int 边界溢出)
return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);
}

// 递归函数:判断当前节点是否在 (low, high) 之间
private boolean helper(TreeNode node, long low, long high) {
// 空树合法
if (node == null) {
return true;
}

// 当前节点 小于等于下限 或 大于等于上限 → 不合法
if (node.val <= low || node.val >= high) {
return false;
}

// 左子树:上限 = 当前节点值
// 右子树:下限 = 当前节点值
return helper(node.left, low, node.val)
&& helper(node.right, node.val, high);
}

// 树节点定义(题目自带)
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;
}
}
}

1. 为什么用long?

因为节点值可以是int最小值/最大值(-2^31 或 2^31-1),
用long可以避免边界判断错误。

2. Long.MIN_VALUE, Long.MAX_VALUE这两个是什么?

  • Long.MIN_VALUE:long 类型能表示的最小数
    = -9223372036854775808
  • Long.MAX_VALUE:long 类型能表示的最大数
    = 9223372036854775807

意思就是:
根节点没有任何上下限制,
只要是正常数字都合法,相当于 -∞ 到 +∞

3. 为什么不用 Integer?

因为二叉树节点的值可能是:
Integer.MIN_VALUE(-2147483648)
Integer.MAX_VALUE(2147483647)
如果我们用 int 的极值当上下界,会出现边界判断错误。
用 long 就完全包住了 int 的范围,不会冲突。

posted @ 2026-04-18 23:26  ZealousMclaren  阅读(11)  评论(0)    收藏  举报