Exercise: Equivalent Binary Trees

发布时间 2023-08-06 16:49:15作者: 熋霸

这个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 := <-ch1
17         v2 := <-ch2
18         if v1 != v2 {
19             return false
20         }
21     }
22     return true
23 }
24 
25 func main() {
26     fmt.Println("walk a random tree:")
27     ch := make(chan int)
28     go Walk(tree.New(1), ch)
29     for i := 0; i < 10; i++ {
30         fmt.Println(<-ch)
31     }
32 
33     fmt.Println("compare two random trees:")
34     fmt.Println("Same(tree.New(1), tree.New(1)) result: ", Same(tree.New(1), tree.New(1)))
35     fmt.Println("Same(tree.New(1), tree.New(2)) result: ", Same(tree.New(1), tree.New(2)))
36 }

前面一页,Go团队居然还不忘踩一下别的语言框架写这个很繁琐。其实不用chan也就多几行代码。