Golang树遍历顺序

时间:2017-11-30 15:28:49

标签: go

刚开始尝试golang,坚持试图在教程中找出树遍历练习

我无法弄清楚树遍历的不同顺序如何影响等效树上的golang教程的结果(https://tour.golang.org/concurrency/8

具体......这是怎么回事......

func Walk(t *tree.Tree, ch chan int){
    ch<-t.Value
    if t.Left != nil{
        Walk(t.Left, ch)
    }
    if t.Right != nil{
        Walk(t.Right, ch)
    }
}

与此不同......

func Walk(t *tree.Tree, ch chan int){

    if t.Left != nil{
        Walk(t.Left, ch)
    }
    ch<-t.Value
    if t.Right != nil{
        Walk(t.Right, ch)
    }
}

我原以为两个都会用以下函数提供相同的结果:

func Same(t1, t2 *tree.Tree) bool{
    chTree1 := make(chan int)
    chTree2 := make(chan int)

    go Walk(t1, chTree1)
    go Walk(t2, chTree2)

    for i:= 0; i < 10; i++{
        a, b := <-chTree1, <-chTree2
        //fmt.Printf("a: %v, b: %v\n", a, b)

        if a != b {
            return false
        }
    }
    return true
}

1 个答案:

答案 0 :(得分:2)

由于New的实施方式,这种情况正在发生:

func New func New(k int) *Tree 
  

New返回一个新的随机二叉树,其中包含值k,2k,...,10k。

因此,虽然使用tree.New(1)创建的两棵树将具有不同的结构,但它们将具有完全相同的元素。

您的第二个Walk实施(下方):

func Walk(t *tree.Tree, ch chan int){

    if t.Left != nil{
        Walk(t.Left, ch)
    }
    ch<-t.Value
    if t.Right != nil{
        Walk(t.Right, ch)
    }
}

正在执行树的inorder traversal。 inorder遍历始终按排序顺序返回树的元素。

因此,对具有相同Walkk值的tree.New(k)的任何调用都会产生相同的元素列表,即k,2k,...,10k。< / p>

这导致此版本的Walk始终返回true。