这个Exercise的答案比较开放,不过遵循说明里面的基本要求:
- Walk遍历随机创建的有序2叉树,将值写入一个chan,按从小到大的顺序输出10个结果。需要注意的是,这个Exercise的随机2叉树说明里面明确了是tree.New(k)创建k, 2k, ..., 10k。所以输出的时候直接循环读10次chan即可。
- Same要求使用Walk遍历的结果,比较两个chan来确定结果,所以也要用chan实现。
主要代码如下(为了明确Walk里面chan的读取方法,附上了main的代码,注意,这里的chan是没有显示close的):
1 func Walk(t *tree.Tree, ch chan int) { 2 if t.Left != nil { 3 Walk(t.Left, ch) 4 } 5 ch <- t.Value 6 if t.Right != nil { 7 Walk(t.Right, ch) 8 } 9 } 10 11 func Same(t1, t2 *tree.Tree) bool { 12 ch1, ch2 := make(chan int), make(chan int) 13 go Walk(t1, ch1) 14 go Walk(t2, ch2) 15 for i := 0; i < 10; i++ { 16 v1, v2 := <-ch1, <-ch2 17 if v1 != v2 { 18 return false 19 } 20 } 21 return true 22 } 23 24 func main() { 25 fmt.Println("walk a random tree:") 26 ch := make(chan int) 27 go Walk(tree.New(1), ch) 28 for i := 0; i < 10; i++ { 29 fmt.Println(<-ch) 30 } 31 32 fmt.Println("compare two random trees:") 33 fmt.Println("Same(tree.New(1), tree.New(1)) result: ", Same(tree.New(1), tree.New(1))) 34 fmt.Println("Same(tree.New(1), tree.New(2)) result: ", Same(tree.New(1), tree.New(2))) 35 }
前面一页,Go团队居然还不忘踩一下别的语言框架写这个很繁琐。其实不用chan也就多几行代码。