gpt4 book ai didi

pointers - Go树遍历,试图看懂代码

转载 作者:IT王子 更新时间:2023-10-29 01:33:54 24 4
gpt4 key购买 nike

我正在查看 Rosettacode.org 上有关树遍历的页面。我正在研究 Go 的实现,我对 Go 还很陌生,这就是为什么我需要你的帮助。

在文件的开头,创建了一个结构。没关系,到目前为止它是有道理的。但我不明白的是:

type node struct {
value int
left, right *node
}

左、右 *node 部分。我知道左,右变量是指向节点的指针类型。但我不明白为什么,首先我不知道你可以包含你正在创建的类型,在这种情况下是实际结构本身中的节点。然后我真的不明白为什么代码不只是说 left, right node

func (n *node) iterPreorder(visit func(int)) {
if n == nil {
return
}
visit(n.value)
n.left.iterPreorder(visit)
n.right.iterPreorder(visit)
}

接下来我不明白的是,visit 变量如何成为 func(int) 类型。然后我也不明白如何在函数 iterPreorder 中使用 iterPreorder

最后我想问一下,这段代码是做什么的?

tree := &node{1,
&node{2,
&node{4,
&node{7, nil, nil},
nil},
&node{5, nil, nil}},
&node{3,
&node{6,
&node{8, nil, nil},
&node{9, nil, nil}},
nil}}

谢谢,here's a link to the full code over on Rosettacode.org.

最佳答案

让我们一步一步来。

  1. 它使用指针,因为 left 和/或 right 可以是 nil(根本没有设置),你不能用它来赋值。此外,如果他们使用 left, right node,您将拥有无限数量的节点,因为该值将始终被设置。

  2. visit func(int) 允许您传递类型为 func(int) 的函数,就像其他语言中的回调一样。

  3. n.left.iterPreorder/n.right.iterPreorder,你实际上是在子节点上调用 iterPreorder,与调用它的节点不同。

  4. 代码只是创建了一棵树并为其分配节点。

为了更好地可视化它:

tree := &node{1,
&node{2,
&node{4,
&node{7, nil, nil},
nil},
&node{5, nil, nil}},
&node{3,
&node{6,
&node{8, nil, nil},
&node{9, nil, nil}},
nil}}

等同于:

tree = &node{value: 1}
tree.left = &node{value:2}
tree.left.left = &node{value: 4}
tree.left.left.left = &node{value: 7}
tree.left.right = &node{value: 5}

tree.right = &node{value:3}
tree.right.left = &node{value: 6}
tree.right.left.left = &node{value: 8}
tree.right.left.right = &node{value: 9}

奖励:

  • 使用&返回一个指针,例如n := &node{}n是一个指向节点的指针。

检查 this关于 Go 指针的优秀文章。

还有 Effective Go是必读的,并尝试浏览 tour

关于pointers - Go树遍历,试图看懂代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25351804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com