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

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);
    }
  1. 逻辑偏离需求:二叉树直径的定义是「任意两个节点之间最长路径的长度」(路径长度为节点数减一),正确解法需要计算每个节点的「左子树深度 + 右子树深度」,再取所有节点的最大值。但你的代码只是返回了树的最大深度,完全没计算直径。
  2. 空指针处理错误:当传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:45:23