Pointers 去树遍历,试着理解代码

Pointers 去树遍历,试着理解代码,pointers,struct,tree,go,tree-traversal,Pointers,Struct,Tree,Go,Tree Traversal,我正在看Rosettacode.org上关于树遍历的页面。我正在看围棋的实现,我是一个新手,这就是为什么我需要你的帮助 就在文件的开头,创建了一个结构。没关系,到目前为止这是有道理的。但我不明白的是: type node struct { value int left, right *node } 左、右*节点部分。我知道左、右变量是指向节点的指针类型。但我不明白为什么,首先,我不知道您可以在实际结构本身中包含您正在创建的类型,在本例中是节点。然后我真的不明白为什么

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

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

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}}

谢谢,让我们一步一步来

  • 它使用指针,因为left和/或right可以为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
      是指向节点的指针
    查看关于Go pointers的优秀文章

    这也是一本必须阅读的书,请尝试阅读

    首先,您需要完全理解指针()的概念。变量
    left,right*node
    的目的是指向其他节点,因为这些节点是指针,所以“在其自身中包含类型”是可以的,因为您实际上只是包含指向它们的指针。至于为什么
    iterproorder
    可以在其内部使用,这称为递归()。如果n==nil{return}行构成了所谓的“基本情况”,确保调用不会永远持续下去。