Concurrency 去旅游树比较不起作用?
我完成了树比较的go tour练习(#69),能够有效地比较两棵树。这是密码Concurrency 去旅游树比较不起作用?,concurrency,go,channel,Concurrency,Go,Channel,我完成了树比较的go tour练习(#69),能够有效地比较两棵树。这是密码 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 == nil {
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 == nil {
return
}
Walk(t.Left,ch)
ch <- t.Value
Walk(t.Right,ch)
}
// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool {
c := make(chan int)
c2 := make(chan int)
go Walk(t1,c)
go Walk(t2,c2)
for i:= 0; i < 10; i++ {
if <-c != <-c2 {
return false
}
}
return true
}
func main() {
fmt.Println(Same(tree.New(1),tree.New(1)))
}
而第二次呼吁步行(树。新的(1),c)打印
为什么在切换walk命令的顺序时两次调用同一函数会导致两个不同的输出?首先,您需要了解树的属性。树的设置使左侧的数字始终小于当前节点的值。右边的数字总是更多 因此,如果你想找到最小的数字,你需要做的就是在每个节点“向左”。如果你找到最低数字的父母,你会得到第二个最低数字。倒数第二名的右子女可能是也可能不是倒数第三名。然而,如果你在每一个机会都从第二低的右边的孩子身上向左走,那么你将在第三低结束。直到遍历每个节点为止 当您对树进行
Walk()
时,实际上是在对数字进行排序
Walk(t.Left,ch)
ch <- t.Value
Walk(t.Right,ch)
步行(t.左,ch)
ch首先,您需要了解树的属性。树的设置使左侧的数字始终小于当前节点的值。右边的数字总是更多
因此,如果你想找到最小的数字,你需要做的就是在每个节点“向左”。如果你找到最低数字的父母,你会得到第二个最低数字。倒数第二名的右子女可能是也可能不是倒数第三名。然而,如果你在每一个机会都从第二低的右边的孩子身上向左走,那么你将在第三低结束。直到遍历每个节点为止
当您对树进行Walk()
时,实际上是在对数字进行排序
Walk(t.Left,ch)
ch <- t.Value
Walk(t.Right,ch)
步行(t.左,ch)
ch看看下面的例子:
它使用了:
Perm作为n整数的一个片段返回
整数[0,n]
您看到的是一个功能:由New
创建的每个树都是随机的。请查看:
它使用了:
Perm作为n整数的一个片段返回
整数[0,n]
您看到的是一个特性:由New
创建的每个树都是随机的。也许我没有得到什么东西,但我仍然不明白,如果我第二次调用同一个函数,为什么输出会改变。无论我调用多少次,都不应该Walk(Tree.New(1),ch)=Walk(Tree.New(1),ch?这涉及到随机性。“函数树.New(k)构造了一个随机结构的二叉树”也许我没有得到什么东西,但我仍然不明白如果我第二次调用同一个函数,为什么输出会改变。不应该Walk(tree.New(1),ch)=Walk(tree.New(1),ch),不管我调用它多少次?这涉及到随机性。”函数树.New(k)构造一个随机结构的二叉树“
7,9,10,8...
Walk(t.Left,ch)
ch <- t.Value
Walk(t.Right,ch)
ch <- t.Value
Walk(t.Right,ch)
Walk(t.Left,ch)
// New returns a new, random binary tree
// holding the values 1k, 2k, ..., nk.
func New(n, k int) *Tree {
var t *Tree
for _, v := range rand.Perm(n) {
t = insert(t, (1+v)*k)
}
return t
}