为了账号安全,请及时绑定邮箱和手机立即绑定

二叉树遍历中的意外输出

二叉树遍历中的意外输出

Go
青春有我 2022-09-12 16:55:38
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 
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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


这意味着该变量将保存从 接收的值,您不需要从 接收。ichch


但是,您没有使用 ,并且您确实从 接收。因此,您将跳过每两个元素(如果通道上传递的元素数量奇数,您也可能会被阻止)。ich


像这样做:


for v := range ch {

    fmt.Printf("%d ", v)

}


查看完整回答
反对 回复 2022-09-12
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

根据伊察的建议:


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)

    }

}


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信