去树遍历,试图理解代码

Fra*_*cis 2 tree struct pointers go tree-traversal

我在Rosettacode.org上看到关于树遍历的这个页面.我正在看Go的实现,我是Go的新手,这就是为什么我想要你的帮助.

在文件的开头,创建一个结构.到目前为止,这是有道理的.但我不明白的是这个:

type node struct {
    value       int
    left, right *node
}
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

我接下来的事情是,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}}
Run Code Online (Sandbox Code Playgroud)

谢谢,这里是Rosettacode.org上完整代码的链接.

One*_*One 5

让我们一步一步来.

  1. 它使用指针,因为左和/或右可以是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}}
Run Code Online (Sandbox Code Playgroud)

是相同的:

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}
Run Code Online (Sandbox Code Playgroud)

奖金:

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

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

同样有效的Go是必读的,并尝试浏览