为了账号安全,请及时绑定邮箱和手机立即绑定

Go 树遍历,试图理解代码

Go 树遍历,试图理解代码

Go
慕斯王 2021-08-10 15:58:40
我正在 Rosettacode.org 上查看有关树遍历的页面。我正在研究 Go 的实现,我对 Go 还很陌生,这就是为什么我需要你的帮助。在文件的开头,创建了一个结构。没关系,到目前为止它是有道理的。但我不明白的是:type node struct {    value       int    left, right *node}的left, right *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}}
查看完整描述

1 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

让我们一步一步来。

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

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

  3. n.left.iterPreordern.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是一个指向节点的指针。

检查此有关围棋的指针优秀文章。


也必须阅读Effective Go,并尝试通过游览


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信