我完成了用于树比较的巡回练习(#69),并且能够有效地比较两棵树。这是代码
package main
import "tour/tree"
import "fmt"
// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int) {
if t == nil {
return
}
Walk(t.Left,ch)
ch <- t.Value
Walk(t.Right,ch)
}
// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool {
c := make(chan int)
c2 := make(chan int)
go Walk(t1,c)
go Walk(t2,c2)
for i:= 0; i < 10; i++ {
if <-c != <-c2 {
return false
}
}
return true
}
func main() {
fmt.Println(Same(tree.New(1),tree.New(1)))
}
令我感到困惑的部分是,如果我将走动功能中的命令顺序切换为
ch <- t.Value
Walk(t.Right,ch)
Walk(t.Left,ch)
比较不再有效。我尝试两次打印Walk(tree.New(1),c)的结果,奇怪的是打印了第一个电话
10,5,7,9...
同时打印Walk(tree.New(1),c)的第二次调用
7,9,10,8...
为什么在切换步行命令的顺序时两次调用同一函数会导致两个不同的输出?
相关分类