刚开始尝试golang,坚持试图在教程中找出树遍历练习
我无法弄清楚树遍历的不同顺序如何影响等效树上的golang教程的结果(https://tour.golang.org/concurrency/8)
具体......这是怎么回事......
func Walk(t *tree.Tree, ch chan int){
ch<-t.Value
if t.Left != nil{
Walk(t.Left, ch)
}
if t.Right != nil{
Walk(t.Right, 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)
}
}
我原以为两个都会用以下函数提供相同的结果:
func Same(t1, t2 *tree.Tree) bool{
chTree1 := make(chan int)
chTree2 := make(chan int)
go Walk(t1, chTree1)
go Walk(t2, chTree2)
for i:= 0; i < 10; i++{
a, b := <-chTree1, <-chTree2
//fmt.Printf("a: %v, b: %v\n", a, b)
if a != b {
return false
}
}
return true
}
答案 0 :(得分:2)
由于New
的实施方式,这种情况正在发生:
func New func New(k int) *Tree
New返回一个新的随机二叉树,其中包含值k,2k,...,10k。
因此,虽然使用tree.New(1)
创建的两棵树将具有不同的结构,但它们将具有完全相同的元素。
您的第二个Walk
实施(下方):
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)
}
}
正在执行树的inorder traversal。 inorder遍历始终按排序顺序返回树的元素。
因此,对具有相同Walk
到k
值的tree.New(k)
的任何调用都会产生相同的元素列表,即k,2k,...,10k。< / p>
这导致此版本的Walk
始终返回true。