ぷらこのきろく

メモとかテストとか備忘録とか

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()はまたそのうち書こう。