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)
让我们一步一步来.
它使用指针,因为左和/或右可以是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}}
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是指向节点的指针.检查此有关围棋的指针优秀文章.