二叉树遍历中的意外输出

unexpected output in binary tree traversal

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

我只是想在 goroutine 中遍历二叉树并向通道添加值。然后在主 goroutine

中打印它们

代码

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

通道上带有 range 子句的 for 语句 从通道接收 值并将它们存储在循环变量中。

意味着 i 变量将保存从 ch 收到的值,您不需要从 ch.

收到

但是,您没有使用 i,并且确实收到了来自 ch 的信息。因此,您将跳过第二个元素(如果频道上传送的元素数量为奇数,您还将面临被阻止的风险)。

这样做:

for v := range ch {
    fmt.Printf("%d ", v)
}

根据icza的建议:

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 v := range ch {
    fmt.Printf("%d ", v)
    }
}