这个Exercise的答案比较开放,不过遵循说明里面的基本要求:

  1. Walk遍历随机创建的有序2叉树,将值写入一个chan,按从小到大的顺序输出10个结果。需要注意的是,这个Exercise的随机2叉树说明里面明确了是tree.New(k)创建k, 2k, ..., 10k。所以输出的时候直接循环读10次chan即可。
  2. 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也就多几行代码。