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

LeetCode 113路径总和II:为何需解构path数组传递?

关于LeetCode 113. 路径总和II中传递数组时使用解构的原因

你疑惑为什么递归调用时不能直接传递原path数组,必须用[...path]做解构?核心原因在于JavaScript里数组是引用类型,直接传原数组的话,所有递归分支都会共享同一个数组的引用,后续的修改操作会互相干扰,最终导致结果完全错误。

具体分析:

如果直接传递原path数组,比如把递归调用改成:

pathSum(root.left, targetSum, sum, path, result)
pathSum(root.right, targetSum, sum, path, result)

会出现这些问题:

  • 当你在某个递归分支里执行path.push(root.val)或者path.pop()时,所有其他分支的path都会跟着变化——因为它们指向的是同一个内存地址里的数组。
  • 比如处理左子树的递归结束后,执行了path.pop(),此时右子树拿到的path已经被修改,记录的路径会缺失当前节点的值,导致最终收集到的路径完全不符合预期。
  • 就算是在叶子节点符合条件时往result里存path,后续的pop操作也会把这个已经存进去的数组给改掉——因为result里存的是数组的引用,不是当时的路径快照。

而用[...path]的作用是创建原数组的浅拷贝,每个递归分支都会拿到一个独立的数组副本,后续对这个副本的push或pop操作只会影响当前分支,不会干扰其他分支的路径状态。这样就能保证:

  • 左子树和右子树的路径修改互不影响
  • 往result里存入的是当前符合条件的路径快照,不会被后续操作篡改

结合你提供的代码看:

代码里在叶子节点不符合条件时会执行path.pop(),如果不用拷贝,这个pop会直接修改原数组,导致后续右子树的递归路径错误;而用拷贝后,每个分支的path都是独立的,各自的修改只会在自己的副本里生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:15:46