首先,当你走完树时,你应该关闭你的频道.这可以通过分离递归函数来实现,如下所示:
func Walk(t *tree.Tree, ch chan int) {
defer close(ch)
if t != nil {
ch <- t.Value
walkRecursively(t.Left, ch)
walkRecursively(t.Right, ch)
}
}
func walkRecursively(t *tree.Tree, ch chan int) {
if t != nil {
ch <- t.Value
walkRecursively(t.Left, ch)
walkRecursively(t.Right, ch)
}
}
现在,相同的()函数可以覆盖两个通道,并知道工作何时完成:
func Same(t1, t2 *tree.Tree) bool {
// two channels for walking over two trees
ch1 := make(chan int)
ch2 := make(chan int)
// two integer slices to capture two results
sequence1 := []int{}
sequence2 := []int{}
// two go routines to push values to the channels
// IMPORTANT! these must be go routines
go Walk(t1, ch1)
go Walk(t2, ch2)
// range over the channels to populate the sequence vars
for n1 := range ch1 {
sequence1 = append(sequence1, n1)
}
for n2 := range ch2 {
sequence2 = append(sequence2, n2)
}
// since trees are randomly structured, we sort
sort.Ints(sequence1)
sort.Ints(sequence2)
// slicesAreEqual is a helper function
return slicesAreEqual(sequence1, sequence2)
}
您的助手函数可能如下所示:
func slicesAreEqual(a, b []int) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}