// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build ignore package main import ( "fmt" "golang.org/x/tour/tree" ) func walkImpl(t *tree.Tree, ch, quit chan int) { if t == nil { return } walkImpl(t.Left, ch, quit) select { case ch <- t.Value: // Value successfully sent. case <-quit: return } walkImpl(t.Right, ch, quit) } // Walk walks the tree t sending all values // from the tree to the channel ch. func Walk(t *tree.Tree, ch, quit chan int) { walkImpl(t, ch, quit) close(ch) } // Same determines whether the trees // t1 and t2 contain the same values. func Same(t1, t2 *tree.Tree) bool { w1, w2 := make(chan int), make(chan int) quit := make(chan int) defer close(quit) go Walk(t1, w1, quit) go Walk(t2, w2, quit) for { v1, ok1 := <-w1 v2, ok2 := <-w2 if !ok1 || !ok2 { return ok1 == ok2 } if v1 != v2 { return false } } } func main() { fmt.Print("tree.New(1) == tree.New(1): ") if Same(tree.New(1), tree.New(1)) { fmt.Println("PASSED") } else { fmt.Println("FAILED") } fmt.Print("tree.New(1) != tree.New(2): ") if !Same(tree.New(1), tree.New(2)) { fmt.Println("PASSED") } else { fmt.Println("FAILED") } }