Java中无自增的print语句是否影响变量?二叉树直径代码异常解析
问题解答
问题1:Java中未使用自增操作的print语句是否会对变量产生影响?
正常情况下不会。print语句的核心作用是读取变量的当前值并输出到控制台,不会对变量本身进行修改。
唯一的例外情况:如果变量是可变对象(比如StringBuilder),且你在print时调用了会修改对象的方法(比如System.out.println(sb.append("test"))),这种情况才会改变对象内部状态,但这不是print语句本身导致的,而是附加的方法调用带来的副作用。单纯的System.out.println(变量)不会影响变量值。
问题2:LeetCode二叉树直径问题代码添加print后通过样本的原因
初始代码的核心问题
你的初始代码逻辑完全不符合二叉树直径的解题要求,而且空指针处理方式错误:
初始代码:
public int toLeaf(TreeNode j){ int ans=1; try{ ans= Math.max(toLeaf(j.left),toLeaf(j.right))+1; }catch(Exception e){ } return ans; } public int diameterOfBinaryTree(TreeNode root) { return toLeaf(root); }
- 逻辑偏离需求:二叉树直径的定义是「任意两个节点之间最长路径的长度」(路径长度为节点数减一),正确解法需要计算每个节点的「左子树深度 + 右子树深度」,再取所有节点的最大值。但你的代码只是返回了树的最大深度,完全没计算直径。
- 空指针处理错误:当传入null节点时,访问
j.left会触发NPE,被catch后返回ans=1——这相当于把空节点的深度错误地算成了1,导致所有节点的深度计算都多了1(比如单节点树,正确直径是0,但你的代码返回1,直接错误)。
添加print后“碰巧”通过样本的原因
修改后的代码添加了try块外的print语句:
public int toLeaf(TreeNode j){ int ans=1; try{ ans= Math.max(toLeaf(j.left),toLeaf(j.right))+1; }catch(Exception e){ } System.out.println(j.val+" "+ans); //here return ans; } public int diameterOfBinaryTree(TreeNode root) { return toLeaf(root); }
当传入null节点时,执行System.out.println(j.val)会触发NPE,且这个异常不在当前方法的try块捕获范围内,所以toLeaf(null)会直接抛出异常。上层调用该方法时,异常会被上层的try块捕获,此时上层的ans保持初始值1——这相当于把空节点的“贡献深度”修正为0(比如叶子节点的左右子树都是null,原本会计算max(1,1)+1=2,现在变成捕获异常后ans=1,刚好等于叶子节点的正确深度1)。
这种情况下,你的代码返回的结果碰巧和部分样本的正确答案一致,但这完全是巧合,代码逻辑依然错误——换个复杂测试用例(比如多分支的树)依然会出错。
正确思路提示
要正确解决这个问题,应该:
- 遍历每个节点,计算该节点的左子树深度和右子树深度,两者之和就是该节点对应的直径。
- 维护一个全局变量记录所有节点中的最大直径。
- 空节点的深度直接返回0,不需要用try-catch处理空指针。
内容的提问来源于stack exchange,提问作者Jagnath reddy
相关产品推荐
相关产品推荐

