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

