Pointers 去树遍历,试着理解代码
我正在看Rosettacode.org上关于树遍历的页面。我正在看围棋的实现,我是一个新手,这就是为什么我需要你的帮助 就在文件的开头,创建了一个结构。没关系,到目前为止这是有道理的。但我不明白的是:Pointers 去树遍历,试着理解代码,pointers,struct,tree,go,tree-traversal,Pointers,Struct,Tree,Go,Tree Traversal,我正在看Rosettacode.org上关于树遍历的页面。我正在看围棋的实现,我是一个新手,这就是为什么我需要你的帮助 就在文件的开头,创建了一个结构。没关系,到目前为止这是有道理的。但我不明白的是: type node struct { value int left, right *node } 左、右*节点部分。我知道左、右变量是指向节点的指针类型。但我不明白为什么,首先,我不知道您可以在实际结构本身中包含您正在创建的类型,在本例中是节点。然后我真的不明白为什么
type node struct {
value int
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)
。然后我也不知道如何在函数iterproorder
中使用iterproorder
最后我想问,这段代码是做什么的
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}}
谢谢,让我们一步一步来
左、右节点
,则节点数将不固定,因为该值将始终设置visit func(int)
允许您传递类型为func(int)
的函数,就像其他语言中的回调一样n.left.iterproorder
/n.right.iterproorder
,您实际上是在子节点上调用iterproorder
,而不是从同一节点调用它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
left,right*node
的目的是指向其他节点,因为这些节点是指针,所以“在其自身中包含类型”是可以的,因为您实际上只是包含指向它们的指针。至于为什么iterproorder
可以在其内部使用,这称为递归()。如果n==nil{return}行构成了所谓的“基本情况”,确保调用不会永远持续下去。