// +build ignore,OMIT package main import ( "fmt" "code.google.com/p/go-tour/tree" ) func Walk(root *tree.Tree, quit chan struct{}) chan int { ch := make(chan int) go func() { walk(root, ch, quit) close(ch) }() return ch } func walk(t *tree.Tree, ch chan int, quit chan struct{}) { if t.Left != nil { walk(t.Left, ch, quit) } select { // HL case ch <- t.Value: // HL case <-quit: // HL return // HL } // HL if t.Right != nil { walk(t.Right, ch, quit) } } // STOP OMIT func Same(t1, t2 *tree.Tree) bool { quit := make(chan struct{}) // HL defer close(quit) // HL w1, w2 := Walk(t1, quit), Walk(t2, quit) for { v1, ok1 := <-w1 v2, ok2 := <-w2 if v1 != v2 || ok1 != ok2 { return false } if !ok1 { return true } } } func main() { fmt.Println(Same(tree.New(3), tree.New(3))) fmt.Println(Same(tree.New(1), tree.New(2))) }