当前位置: 首页 > 知识库问答 >
问题:

在Go Tour等价二叉树上使用多个goroutine

湛钊
2023-03-14

当试图在Go Tour中解决等效二叉树问题的树行走部分时,显而易见的解决方案是使用递归。其他解决方案,如闭包,在对如何解决问题的一般性问题的回答中提供。

我最初的想法是在步行的每一步都使用Goroutine。这不是更好,更Go-onic(什么是Pythonic的围棋等价物?)解决方案?问题是我不知道如何A)在树行走后关闭频道,或者B)以其他方式发出树行走完成的信号。之前的示例使用2个通道,一个用于数据,一个用于退出信号。通过第二个通道不符合问题定义,行走何时结束的根本问题仍然存在。有没有一个优雅的解决方案,每个步骤都有一个Goroutine,或者递归是最好的解决方案?

func Walk(t *tree.Tree, ch chan int) {
    if t != nil {
        go Walk(t.Left, ch)
        ch <- t.Value
        go Walk(t.Right, ch)
    }
    //Done with this node, how do I know when all are done?
}

共有2个答案

时经纬
2023-03-14

您可以使用sync。等待组

func internalWalk(t *tree.Tree, wg *sync.WaitGroup, ch chan int) {
    wg.Add(1)
    if t != nil {
        go Walk(t.Left, ch)
        ch <- t.Value
        go Walk(t.Right, ch)
    }
    wg.Done()
}
func Walk(t *tree.Tree, ch chan int) {
    var wg sync.WaitGroup
    internalWalk(t, &wg, ch)
    wg.Wait()
    //they are all done now, do something here
}
童华池
2023-03-14

在行走的每一步都使用goroutine是行不通的。除了不知道什么时候可以关闭频道(我不知道有什么好方法可以解决这个问题),你不一定能得到你想要的订单。例如,以下代码:

go fmt.Println(1)
go fmt.Println(2)
go fmt.Println(3)

可以打印123、132、213、231、312或321中的任何一个,具体取决于计划程序选择如何运行这些goroutine。这意味着您的Walk实现将不再以正确的顺序提供值。

Goroutines是唯一正确的答案,当你实际上想同时做一些事情时;由于通道的输出必须严格排序,因此在这个问题中没有可利用的并发性。

 类似资料:
  • 我正在努力解决等价的二叉树问题。这就是我所做的; 然而,如果树中没有任何元素,我无法找到如何发出信号。我不能在上使用,因为它会在发送所有值之前关闭通道(因为递归)有人能帮我一下吗?

  • 树的特征和定义 树(Tree)是元素的集合。我们先以比较直观的方式介绍树。下面的数据结构是一个树: 树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。树像是一个不断分叉的树根。 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)。比如说,3,5是6的子节点,6是3,

  • 我正在学习,在本教程中,可以使用并发和通道来完成这个练习:解决方案。 我试图通过解决这个问题。我能想到的解决方案是使用临时数据结构来存储顺序遍历这两棵树的结果,然后进行比较。 例如,我使用存储顺序遍历的结果,然后进行比较(注意,我们正在比较排序的二叉树): 测试用例: 我想知道有没有其他更好的方法通过解决这个问题?

  • 二叉树 二叉树采用二叉链表存储,要求根据给定的先序遍历序列和中序遍历序列建立二叉树,并输出后序遍历序列、结点总数、叶子数、度为1的结点数、度为2的结点数。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据的第一行输入结点数n(1≤n≤10),第二、三行各输入n个整数,分别表示二叉树的先序遍历序列和中序遍历序列。 输出格式: 对于每组测试,在一行上分别输出该二叉树的后序遍历序列,结点总数,叶子

  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 问题内容: 我正在尝试解决等效的二叉树演习。这是我所做的; 但是,我无法找出如何发信号通知树中是否还剩下任何元素。我无法使用on,因为它会使通道在所有值发送之前关闭(因为递归。)有人可以在这里帮我吗? 问题答案: 如果Walk函数本身不递归,则可以使用close()。即步行将做: 其中walkRecurse或多或少是您当前的Walk功能,但是在walkRecurse上递归。(或者您将Walk重写为