二叉树前序遍历递归实现时,作为参数的slice会在同级节点那里的值被覆盖而不是增加。是什么问题?如代码

weixin_38065208 2019-09-20 10:31:07
** tree包**
```
package tree


import (
"log"
)

// Binary Tree
type BinaryTree struct {
Data interface{}
Left *BinaryTree
Right *BinaryTree
}

// 先序遍历 - 递归
func (bt *BinaryTree)PreOrderRec(v []interface{}) {

if bt == nil {
return
}
log.Println("current data :",bt.Data)
v = append(v,bt.Data)
log.Println("v : ",v)
bt.Left.PreOrderRec(v)
bt.Right.PreOrderRec(v)
}
```
** main 包 **
```
package main

import(
"tree"
"log"
)

func main() {

//创建一颗树
root := tree.BinaryTree{"A", nil, nil}
root.Left = &tree.BinaryTree{Data:"B"}
root.Right = &tree.BinaryTree{Data:"C"}
root.Left.Left = &tree.BinaryTree{Data:"D"}
root.Left.Right = &tree.BinaryTree{Data:"F"}
root.Left.Right.Left = new(tree.BinaryTree)
root.Left.Right.Left.Data = "E"

root.Right.Left = &tree.BinaryTree{Data:"G"}
root.Right.Left.Right = &tree.BinaryTree{Data:"H"}
root.Right.Right = &tree.BinaryTree{Data:"I"}

str := make([]interface{},0)
root.PreOrderRec(str)
log.Println(str)

}
```
**输出的str结果**
```
2019/08/21 23:23:28 current data : A
2019/08/21 23:23:28 v : [A]
2019/08/21 23:23:28 current data : B
2019/08/21 23:23:28 v : [A B]
2019/08/21 23:23:28 current data : D
2019/08/21 23:23:28 v : [A B D]
2019/08/21 23:23:28 current data : F
2019/08/21 23:23:28 v : [A B F]
2019/08/21 23:23:28 current data : E
2019/08/21 23:23:28 v : [A B F E]
2019/08/21 23:23:28 current data : C
2019/08/21 23:23:28 v : [A C]
2019/08/21 23:23:28 current data : G
2019/08/21 23:23:28 v : [A C G]
2019/08/21 23:23:28 current data : H
2019/08/21 23:23:28 v : [A C G H]
2019/08/21 23:23:28 current data : I
2019/08/21 23:23:28 v : [A C I]
2019/08/21 23:23:28 []
```
**从输出结果来看,参数传递是值类型的,所以下层函数的改变无法影响到上级函数。但是slice不是引用类型的么。参数传递过程中理论上下层函数对其更改是可以影响到上层函数的吧**
...全文
44 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38065217 2019-09-20
  • 打赏
  • 举报
回复
func (bt \*BinaryTree)PreOrderRec(v \*[]interface{}) 参数采用指针就好了。 不过很奇怪,slice本身应该是引用类型吧,那作为参数传递时,应该就是像map或者指针类型的一样,下层函数改动会影响上层函数的吧。为什么在这里却不是呢,弄得好像值传递一样。
weixin_38065391 2019-09-20
  • 打赏
  • 举报
回复
slice(map)记得是很特殊的值。 主要在于在扩展时他值的位置会法身变动。这时会有类似引用的行为 但他本身又不完全是引用值。
weixin_38065708 2019-09-20
  • 打赏
  • 举报
回复
golang里的slice底层会指向一个数组,slice在append之后会指向新的数组,感兴趣可以去看看golang的slice底层实现。
weixin_38076910 2019-09-20
  • 打赏
  • 举报
回复
值传递对于引用类型传递的是指针的值, 所以值传递并不是你说的“参数传递过程中理论上下层函数对其更改是可以影响到上层函数的吧”的原因,slice是引用类型才是。

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧