切片神奇地更新

我正在尝试编写一个程序来查找二叉树中的所有从根到叶的路径,其中每个路径的总和等于给定的总和。


以下是我想出的代码


package main


import (

    "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?


我知道切片是按值传递的,切片值是标题,描述了支持数组的连续部分。但是我仍然不明白该值是如何在随后的递归中被替换的。



小唯快跑啊
浏览 122回答 1
1回答

偶然的你

Go 中的切片是包含指向底层数组的指针、长度和容量的小描述符。有关更多详细信息,请参阅切片内部。将切片传递给函数时,会复制描述符,但不会复制底层数组。这意味着currentPath它将始终指向相同的底层数组,但通过递归将具有不同的值:在节点11:currentPath = [5 4 11]在节点2:currentPath =  [5 4 11 2]。添加到paths长度 4。备份到节点11:currentPath = [5 4 11]在节点7:currentPath = [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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go