Go Tour 中的等效二叉树
本练习涉及确定两个二叉树是否包含相同的值。在您的实现中,您正确地使用 goroutine 同时遍历两棵树并将它们的值发送到通道。然而,当试图表明树中没有更多元素时,就会出现问题。
避免过早关闭
在 Walk 上使用 close(ch) 会过早地关闭在发送所有值之前关闭通道,因为递归会提前退出。相反,一个优雅的解决方案涉及使用闭包:
func Walk(t *tree.Tree, ch chan int) { defer close(ch) // Closes the channel when this function returns var walk func(t *tree.Tree) walk = func(t *tree.Tree) { if t == nil { return } walk(t.Left) ch <- t.Value walk(t.Right) } walk(t) }
这个闭包捕获 ch 通道并确保它仅在没有更多节点可遍历时才关闭。 defer close 语句确保闭包在所有递归调用完成后运行。
通过此修复,您的 Same 函数可以通过迭代地从通道接收值并比较它们来准确确定等效性。
以上是Go 中 Goroutine 和 Channels 如何高效比较两棵二叉树的值?的详细内容。更多信息请关注PHP中文网其他相关文章!