Walk()つづき
再帰使わずにがんばる方法、寝ようと思ったらなんか思いついたので書いてみた。
type node struct { self *tree.Tree left bool //true: 行ったことあるよー right bool prev *node } func Walk(t *tree.Tree, ch chan int) { now := new(node) now.self = t now.left = false now.right = false var tmp *node for { tmp = now if now.left == false && now.self.Left != nil { //左に行ける now.left = true now = new(node) now.prev = tmp now.self = tmp.self.Left continue } else if now.right == false && now.self.Right != nil { //右に行ける now.right = true now = new(node) now.prev = tmp now.self = tmp.self.Right continue } else if now.prev != nil { //右にも左にも行けないけど親があるとき、処理して親へ ch <- now.self.Value now = now.prev continue } else { //根 ch <- now.self.Value break } } close (ch) return }
if~else if~で書いてたらcontinueいらんやんと思わなくもないが、とりあえず動いてるっぽいのでこれで許してもらおう。
Same()はまたそのうち書こう。