我正在努力解决等价的二叉树问题。这就是我所做的;
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)
,因为它会在发送所有值之前关闭通道(因为递归)有人能帮我一下吗?
这里是完整的解决方案使用的想法在这里和从谷歌集团线程
package main
import "fmt"
import "code.google.com/p/go-tour/tree"
// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int) {
var walker func(t *tree.Tree)
walker = func (t *tree.Tree) {
if (t == nil) {
return
}
walker(t.Left)
ch <- t.Value
walker(t.Right)
}
walker(t)
close(ch)
}
// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool {
ch1, ch2 := make(chan int), make(chan int)
go Walk(t1, ch1)
go Walk(t2, ch2)
for {
v1,ok1 := <- ch1
v2,ok2 := <- ch2
if v1 != v2 || ok1 != ok2 {
return false
}
if !ok1 {
break
}
}
return true
}
func main() {
fmt.Println("1 and 1 same: ", Same(tree.New(1), tree.New(1)))
fmt.Println("1 and 2 same: ", Same(tree.New(1), tree.New(2)))
}
如果Walk函数本身不递归,可以使用close()。i、 e.步行就可以:
func Walk(t *tree.Tree, ch chan int) {
walkRecurse(t, ch)
close(ch)
}
其中walkRecurse或多或少是您当前的Walk函数,但在walkRecurse上递归。(或者将Walk重写为迭代式-这当然更麻烦)使用这种方法,您的()函数必须了解通道已关闭,这是通过窗体的通道接收完成的
k, ok1 := <-ch
g, ok2 := <-ch
当ok1
和ok2
不同时,或者当它们都是false
时,采取适当的操作
另一种方法(但可能不符合本练习的精神)是计算树中的节点数:
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()函数,该函数应计算*树中的节点数
Go语言坚果小组提出了一个使用闭包的优雅解决方案,
func Walk(t *tree.Tree, ch chan int) {
defer close(ch) // <- closes the channel when this function returns
var walk func(t *tree.Tree)
walk = func(t *tree.Tree) {
if t == nil {
return
}
walk(t.Left)
ch <- t.Value
walk(t.Right)
}
walk(t)
}
问题内容: 我正在尝试解决等效的二叉树演习。这是我所做的; 但是,我无法找出如何发信号通知树中是否还剩下任何元素。我无法使用on,因为它会使通道在所有值发送之前关闭(因为递归。)有人可以在这里帮我吗? 问题答案: 如果Walk函数本身不递归,则可以使用close()。即步行将做: 其中walkRecurse或多或少是您当前的Walk功能,但是在walkRecurse上递归。(或者您将Walk重写为
我正在解围棋中的练习,等价的二叉树。此练习需要实现一个函数,该函数将遍历一棵树,并将所有值有序地从树发送到通道。 演习声明指出: ...我们将使用Go的并发和通道编写一个简单的解决方案。 阅读这一行,我认为实现是一个挑战,它为每个左/右子树启动一个goroutine,并使比非并发版本运行得更快(关于时间复杂度)。让我用代码更详细地解释一下。 这是我早期的行走代码: 它当然使用goroutines,
二叉树是最简单的树形数据结构,虽然它在许多语言中被哈希表取代,但仍旧对于一些应用很实用。二叉树的各种变体可用于一些非常实用东西,比如数据库的索引、搜索算法结构、以及图像处理。 我把我的二叉树叫做BSTree,描述它的最佳方法就是它是另一种Hashmap形式的键值对储存容器。它们的差异在于,哈希表为键计算哈希值来寻找位置,而二叉树将键与树中的节点进行对比,之后深入树中找到储存它的最佳位置,基于它与其
在本练习中,我将让你将数据结构的中文描述翻译成工作代码。你已经知道如何使用“大师复制”方法,分析算法或数据结构的代码。你还可以了解如何阅读算法的伪代码描述。现在你将结合二者,并学习如何拆分一个相当松散的二进制搜索树的英文描述。 我打算马上开始,并提醒你,当你做这个练习的时候,不要访问维基百科页面。维基百科的二进制搜索树描述拥有可以工作的 Python 代码,因此它会使此练习失败。如果你卡住了,那么
HLOJ 9576,习题7-2 二叉排序树 输入一个整数关键字序列,生成一棵用链式存储结构存储的二叉排序树,对该二叉排序树能进行查找和插入结点的操作,并对该二叉排序树中结点的关键字按递增和递减顺序输出。 要求依次完成以下工作: (1) 以这n个整数生成(建立)一棵用链式存储结构存储的二叉排序树; (2) 按递增顺序输出该二叉排序树中的整数(关键字); (3) 输入一个整数key1,对该二叉排序树进
题目链接 牛客网 题目描述 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 解题思路 前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。然后分别对左右子树递归地求解。 // java // 缓存中序遍历数组每个值对应的索引 private Map ind