go语言中切片是引用传递的,所以可以在函数中修改切片的值,但在树的遍历中可能遇到如下问题
测试代码
package main
import "fmt"
type TreeNode struct {
value int
leftNode *TreeNode
rightNode *TreeNode
}
//test1
func testSilce(num []int) {
num[0] = -1
}
//test2
//树的前序遍历
func preorder(root *TreeNode, result *[]int) {
if root == nil {
return
}
preorder(root.leftNode, result)
*result = append(*result, root.value)
//打印地址
fmt.Printf("%p\n", result)
preorder(root.rightNode, result)
}
//test3
func preorder2(root *TreeNode, result []int) {
if root == nil {
return
}
preorder2(root.leftNode, result)
result = append(result, root.value)
fmt.Printf("%p\n", &result)
preorder2(root.rightNode, result)
}
func main() {
//test1
fmt.Println("test1========")
var num []int
num = append(num, 1)
num = append(num, 2)
fmt.Println(num)
testSilce(num)
//证明切片为引用传递,num中值已经被修改
fmt.Println(num)
//test2
var root TreeNode
var left TreeNode
var right TreeNode
root.value = 10
left.value = 11
right.value = 12
root.leftNode = &left
root.rightNode = &right
var result []int
fmt.Println("test2========")
preorder(&root, &result)
fmt.Println(result)
//test3
fmt.Println("test3========")
var result2 []int
preorder2(&root, result2)
fmt.Println(result2)
}
代码运行结果
下面结果,主要看test2和test3,如果不进行指针传递的话。每次树的递归操作,返回的result切片的地址都不同,相当于每次都产生了新的切片。