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

排查Java中打印给定范围[min,max]内BST键值的代码错误

代码错误点整理

1. Node类构造方法赋值错误

private Node(E data) {
    data = data;
    left = right = null;
}

这里参数data和成员变量data重名,代码直接将局部参数赋值给自己,成员变量data根本没有被赋值,所有节点的data默认是null,后续比较操作会直接抛出空指针异常。正确写法应该是:

private Node(E data) {
    this.data = data;
    left = right = null;
}

2. 范围打印逻辑完全错误

你使用了互斥的if...else if...else分支结构,三个逻辑只能执行一个,完全不符合BST范围遍历的要求,正确的BST范围遍历需要三个独立的判断,而非互斥分支:

  • 若当前节点值 > min,需要递归左子树(左子树存在更小的、可能落在范围内的节点)
  • 若当前节点值落在[min, max]区间内,直接打印当前节点
  • 若当前节点值 < max,需要递归右子树(右子树存在更大的、可能落在范围内的节点)

原代码的具体问题:

  • 如果当前节点值大于min,只会执行左递归,不会打印本身,也不会递归右子树,直接漏掉当前节点和右子树所有符合条件的节点
  • 打印逻辑写在else if分支,只有当前节点值<=min的时候才会判断是否在区间内,逻辑矛盾,绝大部分符合区间的节点根本不会走到打印分支
  • 最后的else分支统一递归右子树逻辑完全错误:如果当前节点值大于max,应该递归左子树而非右子树,否则会遍历完全不在范围内的更大节点

修正后的打印方法

public void printPart(E min, E max) {
    print(root, min, max);
}

private void print(Node<E> n, E min, E max){
    if(n == null) {
        return;
    }
    int cmpMin = n.data.compareTo(min);
    int cmpMax = n.data.compareTo(max);
    // 递归左子树
    if(cmpMin > 0){
        print(n.left, min, max);
    }
    // 打印当前符合条件的节点
    if(cmpMin >=0 && cmpMax <=0){
        System.out.println(n.data);
    }
    // 递归右子树
    if(cmpMax < 0){
        print(n.right, min, max);
    }
}

3. 编码规范问题(非逻辑错误,不符合Java约定)

普通方法名Print大写开头,Java普通方法应该使用小驼峰命名,建议修改为print。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:24:07