二叉树的 Go 等价测试
二叉树等价测试,如 Go Tour 练习 #7 中所示,对确定二叉树提出了挑战包含相同值的两棵树的等价性。人们可以尝试通过同时遍历两棵树并将它们的值发送到通道来实现这一目标。然而,确保遍历的终止和剩余元素不存在的信号被证明是一个关键障碍。
提供的代码尝试通过将值从树发送到通道并同时使用它们来处理此任务在同一个函数中。然而,在 Walk 函数中使用 close(ch) 是有问题的,因为它会过早终止通道,从而阻止发送所有值。
幸运的是,golang-nuts 小组提出了一个优雅的解决方案,利用闭包来解决本期:
func Walk(t *tree.Tree, ch chan int) { defer close(ch) // Closes the channel upon function return 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) }
修改后的代码利用闭包来实现树的遍历。 defer 语句确保通道在遍历完成后关闭。该机制可以优雅地处理剩余元素不存在的信号,确保准确的等价性检查。
以上是我们如何有效地测试 Go 中的二叉树等价性?的详细内容。更多信息请关注PHP中文网其他相关文章!