二叉树遍历中的意外输出
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)
}
}
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)
}
}