Go Tour Exercise: Equivalent Binary Trees

前端 未结 23 1817
攒了一身酷
攒了一身酷 2020-12-12 23:39

I am trying to solve equivalent binary trees exercise on go tour. Here is what I did;

package main

import \"tour/tree\"
import \"fmt\"

// Walk walks the tr         


        
23条回答
  •  遥遥无期
    2020-12-13 00:18

    I wrote 2 versions that always read both channels to the end:

    package main
    
    import (
        "fmt"
        "golang.org/x/tour/tree"
    )
    
    func Walk(t *tree.Tree, ch chan int) {
        var walker func(t *tree.Tree)
        walker = func(t *tree.Tree) {
            if t == nil {
                return
            }
            walker(t.Left)
            ch <- t.Value
            walker(t.Right)
        }
        walker(t)
        close(ch)
    }
    
    func Same(t1, t2 *tree.Tree, sameChan func(ch1, ch2 chan int) bool) bool {
        ch1, ch2 := make(chan int), make(chan int)
        go Walk(t1, ch1)
        go Walk(t2, ch2)
    
        return sameChan(ch1, ch2)
    }
    
    func sameChan1(ch1, ch2 chan int) bool {
        areSame := true
        for {
            v1, ok1 := <-ch1
            v2, ok2 := <-ch2
    
            if !ok1 && !ok2 {
                return areSame
            }
    
            if !ok1 || !ok2 || v1 != v2 {
                areSame = false
            }
        }
    }
    
    func sameChan2(ch1, ch2 chan int) bool {
        areSame := true
        for v1 := range ch1 {
            v2, ok2 := <-ch2
    
            if !ok2 || v1 != v2 {
                areSame = false
            }
        }
        for _ = range ch2 {
            areSame = false
        }
        return areSame
    }
    
    func main() {
        fmt.Println(Same(tree.New(1), tree.New(1), sameChan1))
        fmt.Println(Same(tree.New(2), tree.New(1), sameChan1))
        fmt.Println(Same(tree.New(1), tree.New(2), sameChan1))
    
        fmt.Println(Same(tree.New(1), tree.New(1), sameChan2))
        fmt.Println(Same(tree.New(2), tree.New(1), sameChan2))
        fmt.Println(Same(tree.New(1), tree.New(2), sameChan2))
    }
    

提交回复
热议问题