| // +build ignore,OMIT |
| |
| package main |
| |
| import ( |
| "fmt" |
| |
| "code.google.com/p/go-tour/tree" |
| ) |
| |
| func Walk(root *tree.Tree) *Walker { |
| return &Walker{stack: []*frame{{t: root}}} |
| } |
| |
| type Walker struct { |
| stack []*frame |
| } |
| |
| type frame struct { |
| t *tree.Tree |
| pc int |
| } |
| |
| func (w *Walker) Next() (int, bool) { |
| if len(w.stack) == 0 { |
| return 0, false |
| } |
| |
| // continued next slide ... |
| // CUT OMIT |
| f := w.stack[len(w.stack)-1] |
| if f.pc == 0 { |
| f.pc++ |
| if l := f.t.Left; l != nil { |
| w.stack = append(w.stack, &frame{t: l}) |
| return w.Next() |
| } |
| } |
| if f.pc == 1 { |
| f.pc++ |
| return f.t.Value, true |
| } |
| if f.pc == 2 { |
| f.pc++ |
| if r := f.t.Right; r != nil { |
| w.stack = append(w.stack, &frame{t: r}) |
| return w.Next() |
| } |
| } |
| w.stack = w.stack[:len(w.stack)-1] |
| return w.Next() |
| } |
| |
| // STOP OMIT |
| |
| func Same(t1, t2 *tree.Tree) bool { |
| w1, w2 := Walk(t1), Walk(t2) |
| for { |
| v1, ok1 := w1.Next() |
| v2, ok2 := w2.Next() |
| 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))) |
| } |