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

