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

JavaScript树遍历递归传参sum退出最后一层递归时被重置为0求解

问题原因

你遇到的这个问题本质是 JavaScript 原始值按值传递的特性 导致的:

  • sum 是 Number 类型,属于 JS 原始值(基础类型),所有原始值在函数传参时都是按值传递:你把外层的 sum 传给 traverse 函数时,实际传的是它的拷贝,和外层的原始变量完全独立。
  • 你在 traverse 函数内、所有递归栈中对 sum 做的累加操作,都只是修改当前函数栈里的拷贝值,完全不会影响 sumOfLeftLeaves 函数中定义的初始 sum 变量。所以无论递归过程中计算的结果是多少,最终外层返回的 sum 永远是初始赋值的0。

另外你的代码还存在逻辑缺陷:当前只要存在左节点就会累加它的值,没有判断左节点是不是叶子节点,不符合「左叶子之和」的计算要求。

修复方案

这里给两种常用的改造方式:

方案1:用引用类型承载求和结果

数组、对象属于引用类型,函数传参时传递的是内存地址,内部修改会同步到外层的原始变量:

var sumOfLeftLeaves = function(root) {
    if (!root) return 0;
    const sum = [0];
    traverse(root, sum);
    return sum[0];
};

function traverse(root, sum) {
    const left = root.left;
    const right = root.right;

    if (left) {
        // 仅左节点是叶子节点时才累加
        if (!left.left && !left.right) {
            sum[0] += left.val;
        } else {
            traverse(left, sum);
        }
    }
    if (right) {
        traverse(right, sum);
    }
}

方案2:递归函数直接返回求和结果

不需要依赖外部变量,让每层递归返回当前子树的左叶子之和,逐层累加即可:

var sumOfLeftLeaves = function(root) {
    return traverse(root);
};

function traverse(root) {
    if (!root) return 0;
    let currentSum = 0;
    // 左节点是叶子则累加
    if (root.left && !root.left.left && !root.left.right) {
        currentSum += root.left.val;
    }
    // 累加左右子树的左叶子和
    currentSum += traverse(root.left);
    currentSum += traverse(root.right);
    return currentSum;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:03