不使用通道,我能够比较这两棵树是否等价,但使用通道,我不能弄清楚如何做。
下面是我使用通道编写的示例代码。
func Walk(t *Tree, ch chan int) {
if t == nil {
return
}
Walk(t.Left, ch)
ch <- t.Value
Walk(t.Right, ch)
}
func Same(t1, t2 *Tree) bool {
t1Ch := make(chan int)
t2Ch := make(chan int)
Walk(t1, t1Ch)
Walk(t2, t2Ch)
output := make(chan bool)
go func() {
n1 := <-t1Ch
n2 := <-t2Ch
output <- n1 == n2
}()
return <-output
}
func main() {
fmt.Println((&root, &root1))
}
字符串
注::U可以在这里找到完整的描述https://go.dev/tour/concurrency/7
2条答案
按热度按时间atmip9wb1#
首先,你应该关闭你的渠道时,完成了走树。这可以通过分离递归函数来实现,如下所示:
字符串
现在你的Same()函数可以覆盖两个通道,并知道工作何时完成:
型
你的helper函数可能看起来像这样:
型
41ik7eoe2#
我发现的几个问题:
Walk
函数永远不会关闭通道,这可能会使读取器/接收器等待更多,无限期阻塞或陷入死锁。我建议在你完全走完树后关闭频道。
Same
函数中,您调用了Walk
两次,但第一次调用将无限期阻塞,因为它将尝试将内容发送到未缓冲的通道(t1Ch := make(chan int)
),并且还没有人阅读/使用它。给通道添加一个缓冲区似乎是一个简单的解决方案,但我不推荐这样做,你不能预测树的大小,所以它是不可靠的,你只是把问题踢到一边。
尝试在一个goroutine中调用
Walk
,这样你的Same
函数就可以继续运行。