问题1
问题描述:递归的过程中,传递了一个切片作为参数,每次我们都需要对切片切取首元素,之后递归回来的时候发现切片中的元素还是没有切取首元素,是一个很严重的逻辑错误。
问题解决:我们递归函数使用切片作为参数的时候,我们直接传入切片的地址。因为切片每次删除元素,地址也会改变。当切片增加元素引起扩容,地址也会发生改变,而如果只传入切片我们只是引用最开始的时候的切片的地址,因此会发现切片没有任何改变。
例如我们自己写的二叉树序列化和反序列化代码:在最开始只是传递一个切片,但是后来传递切片的地址进去发现代码逻辑正常运行。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
func PreorderSerialize(root *TreeNode) string { if root == nil { return "#!" }
var ret string
ret += strconv.Itoa(root.Val) + "!" ret += PreorderSerialize(root.Left) ret += PreorderSerialize(root.Right) return ret }
func PreorderDeserialize(ret string) *TreeNode { strs := strings.Split(ret, "!")
root := ReconstructTreeFromPreorder(&strs) return root }
func ReconstructTreeFromPreorder(strs *[]string) *TreeNode { if (*strs)[0] == "#" { (*strs) = (*strs)[1:] return nil }
val, _ := strconv.Atoi((*strs)[0]) node := &TreeNode{ Val: val, }
(*strs) = (*strs)[1:] node.Left = ReconstructTreeFromPreorder(strs) node.Right = ReconstructTreeFromPreorder(strs)
return node }
|