猿问

二叉树遍历中的意外输出

func New(k int) *Tree

// New() returns a random binary tree holding the values k, 2k, ..., 10k.

我只是尝试在戈鲁丁中遍历二叉树并向通道添加值。然后用主戈鲁廷打印它们


法典


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

    if t != nil {

        binary(t.Left, ch)

        ch <- t.Value

        binary(t.Right, ch)

    }

}


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

    defer close(ch)

    binary(t, ch)

}


func main() {

    ch := make(chan int)

    go Walk(tree.New(1), ch)

    for i := range ch {

        fmt.Printf("%d ", <-ch)

        _ = i

    }

}

预期输出 =1 2 3 4 5 6 7 8 9 10 


结果 =2 4 6 8 10 


青春有我
浏览 64回答 2
2回答

犯罪嫌疑人X

在通道上带有子句的语句从通道接收值,并将它们存储在循环变量中。forrange这意味着该变量将保存从 接收的值,您不需要从 接收。ichch但是,您没有使用 ,并且您确实从 接收。因此,您将跳过每两个元素(如果通道上传递的元素数量奇数,您也可能会被阻止)。ich像这样做:for v := range ch {&nbsp; &nbsp; fmt.Printf("%d ", v)}

明月笑刀无情

根据伊察的建议:func binary(t *tree.Tree, ch chan int) {&nbsp; &nbsp; if t != nil {&nbsp; &nbsp; &nbsp; &nbsp; binary(t.Left, ch)&nbsp; &nbsp; &nbsp; &nbsp; ch <- t.Value&nbsp; &nbsp; &nbsp; &nbsp; binary(t.Right, ch)&nbsp; &nbsp; }}func Walk(t *tree.Tree, ch chan int) {&nbsp; &nbsp; defer close(ch)&nbsp; &nbsp; binary(t, ch)}func main() {&nbsp; &nbsp; ch := make(chan int)&nbsp; &nbsp; go Walk(tree.New(1), ch)&nbsp; &nbsp; for v := range ch {&nbsp; &nbsp; fmt.Printf("%d ", v)&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答