我在试着解决围棋巡回赛中的equivalent binary trees个练习.这就是我所做的;

package main

import "tour/tree"
import "fmt"

// Walk walks the tree t sending all values
// from the tree to the channel 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)
    }

}

// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool {
    ch1 := make(chan int)
    ch2 := make(chan int)
    go Walk(t1, ch1)
    go Walk(t2, ch2)
    for k := range ch1 {
        select {
        case g := <-ch2:
            if k != g {
                return false
            }
        default:
            break
        }
    }
    return true
}

func main() {
    fmt.Println(Same(tree.New(1), tree.New(1)))
    fmt.Println(Same(tree.New(1), tree.New(2)))
}

然而,如果树上没有更多的元素,我不知道如何发出信号.我不能在Walk()上使用close(ch),因为它使通道在发送所有值之前关闭(因为是递归).这里有人能帮我一把吗?

推荐答案

如果Walk函数本身没有递归,则可以使用Close().也就是说,步行可以做到以下几点:

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

其中walkRecurse或多或少是您当前的Walk函数,但在walkRecurse上递归. (或者您将Walk重写为迭代式-当然,这会更麻烦) 使用这种方法,您的相同()函数必须获知通道是closed,这是通过表单的通道接收来完成的

k, ok1 := <-ch
g, ok2 := <-ch

ok1ok2不同时,或者两者都是false时,采取适当的行动

另一种方法(但可能与本练习的精神不同)是计算树中的 node 数:

func Same(t1, t2 *tree.Tree) bool {
    countT1 := countTreeNodes(t1)
    countT2 := countTreeNodes(t2)
    if countT1 != countT2 {
        return false
    }
    ch1 := make(chan int)
    ch2 := make(chan int)
    go Walk(t1, ch1)
    go Walk(t2, ch2)
    for i := 0; i < countT1; i++ {
        if <-ch1 != <-ch2 {
            return false
        }
    }
    return true
}

您必须实现countTreeNodes()函数,该函数应该计算*树中的 node 数

Go相关问答推荐

gorm插入不支持的数据

调用API时使用nginx作为反向代理时从nginx获取502坏网关

golang有int32溢出吗?

关于如何使用 Service Weaver 设置多个不同侦听器的问题

go测试10m后如何避免超时

如何确定泛型类型在运行时是否可比较?

无效操作:v > max(类型参数 T 与 > 不可比较)

go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效

我无法使用反向代理更改主机标头

Golang 创建一个带有处理程序的模拟数据库并使用接口调用数据库

将文本文件放入切片然后进行比较

泛型:实现嵌套接口

Go 切片容量增长率

在删除级联时无法在 Gorm 中按预期工作

如何使用 math/big 对 bigInt 进行取模?

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

为什么import和ImportSpec之间可以出现多行注释,而PackageName和ImportPath之间不能出现?

有没有办法在 golang 中定义可索引类型?

从 Go struct 中提取标签作为 reflect.Value

如何发送带有登录数据的 GET 请求并将 cookie 数据保存到 txt 文件?