统计大于所有子节点的非叶子节点数量,Java实现错误排查求助
代码错误排查及修复方案
核心错误点
- 1 逻辑运算符误用
代码中判断节点值是否大于左右子节点时使用了按位与运算符&,应替换为逻辑与运算符&&。前者会强制执行两侧所有表达式,没有短路特性,既不符合逻辑判断的常规写法,也容易引发额外的运行时异常。 - 2 无子节点时的比较逻辑错误
当节点不存在左/右子节点时,代码将对应侧的resultL.info/resultR.info赋值为当前节点的值,会导致当前节点和自身比较,结果永远不满足>0的条件。比如你给出的示例二叉树:根节点4只有右子节点3,因为没有左子节点,resultL.info被设为4,4.compareTo(4) = 0,判断条件不成立,最终返回结果为0,和预期的1不符,这是最影响功能的核心bug。 - 3 潜在空指针风险
若自定义类Result2的成员变量n没有显式初始化,当n为包装类型Integer时会触发空指针异常,建议在类定义时就给n赋初始值0。
修正后的代码
// Result2类建议先做初始化处理 class Result2<T> { public T info; public int n = 0; // 显式初始化计数器为0 } public Result2<T> countBigger() { Result2<T> result = new Result2<T>(); result.info = this.info; if(this.isLeaf()) { result.n = 0; return result; } boolean match = true; Result2<T> resultL = null; Result2<T> resultR = null; if(this.hasLeft()) { resultL = this.left.countBigger(); if(result.info.compareTo(resultL.info) <= 0) { match = false; } result.n += resultL.n; } if(this.hasRight()) { resultR = this.right.countBigger(); if(result.info.compareTo(resultR.info) <= 0) { match = false; } result.n += resultR.n; } if(match) { result.n++; } return result; }
验证说明
你给出的示例二叉树使用修正后的代码运行,根节点4只有右子节点3,判断时仅和3比较,4>3符合条件,返回计数器值为1,和预期结果一致。
内容的提问来源于stack exchange,提问作者JamesR
相关产品推荐
相关产品推荐

