猿问

Go 树遍历,试图理解代码

我正在 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}}


慕斯王
浏览 177回答 1
1回答

梵蒂冈之花

让我们一步一步来。它使用指针,因为 left 和/或 right 可以是 nil (根本没有设置),你不能有一个值。此外,如果他们使用,left, right node您将拥有无限数量的节点,因为该值将始终被设置。visit func(int)允许您传递类型为 的函数func(int),例如其他语言中的回调。n.left.iterPreorder/ n.right.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}}是相同的: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,并尝试通过游览
随时随地看视频慕课网APP

相关分类

Go
我要回答