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

