为了账号安全,请及时绑定邮箱和手机立即绑定

切片神奇地更新

切片神奇地更新

Go
小唯快跑啊 2022-06-21 10:39:09
我正在尝试编写一个程序来查找二叉树中的所有从根到叶的路径,其中每个路径的总和等于给定的总和。以下是我想出的代码package mainimport (    "fmt")type TreeNode struct {     Val int     Left *TreeNode     Right *TreeNode}func main() {    root := TreeNode{       Val : 5,       Left: &TreeNode {            Val : 4,           Left : &TreeNode {                Val : 11,                Left : &TreeNode { Val : 2},                Right : &TreeNode { Val : 7},                        },                },    }        paths := [][]int{}    pathSumRecursive(&root, 22, []int{}, &paths)    fmt.Println("paths:", paths)}func pathSumRecursive(root *TreeNode, sum int, currentPath []int, paths *[][]int) {    if root == nil {        return     }        currentPath = append(currentPath, root.Val)        if root.Left == nil && root.Right == nil && root.Val == sum {        *paths = append(*paths, currentPath)        fmt.Println("paths updated ", *paths)        return    }         pathSumRecursive(root.Left, sum-root.Val, currentPath, paths)     pathSumRecursive(root.Right, sum-root.Val, currentPath, paths)    }该程序的输出是paths updated  [[5 4 11 2]]paths: [[5 4 11 7]]我不明白的是附加的值,paths它只[5 4 11 2]更新了一次。那么是什么导致2(最后一个元素)更新为7?我知道切片是按值传递的,切片值是标题,描述了支持数组的连续部分。但是我仍然不明白该值是如何在随后的递归中被替换的。
查看完整描述

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

Go 中的切片是包含指向底层数组的指针、长度和容量的小描述符。有关更多详细信息,请参阅切片内部

将切片传递给函数时,会复制描述符,但不会复制底层数组。这意味着currentPath它将始终指向相同的底层数组,但通过递归将具有不同的值:

  • 在节点11currentPath = [5 4 11]

  • 在节点2currentPath =  [5 4 11 2]。添加到paths长度 4。

  • 备份到节点11currentPath = [5 4 11]

  • 在节点7currentPath = [5 4 2 7]

在 node7中,底层数组仍然是相同的,并且与存储在paths. 但是节点 7 现在附加7到长度为 3 的切片上,覆盖了2底层数组中的先前值。

一个快速的解决方案是复制currentPathinto的内容,path而不是直接存储切片:

   if root.Left == nil && root.Right == nil && root.Val == sum {

        newSlice := make([]int, len(currentPath))

        copy(newSlice, currentPath)

        *paths = append(*paths, newSlice)

        fmt.Println("paths updated ", *paths)

        return

    }

重要说明:当切片需要增长时,会复制底层数组,从而产生一个单独的数组。在示例中,切片在节点处增长到 4 的容量,因此它在节点和4处保持相同的底层数组。如果它在 node 增长,添加到的切片不会与任何人共享其底层数组。272path


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信