Exercise: Equivalent Binary Trees (二叉树对比)

本文探讨了使用Go语言并发特性检查两棵二叉树是否包含相同数值的问题。通过递归方法遍历二叉树并将数值发送到通道中进行比较。文章还讨论了如何避免goroutine泄露,并提供了官方解决方案链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A Tour of Go

Exercise: Equivalent Binary Trees

https://tour.golang.org/concurrency/7

 

检查两棵二叉树是否包含相同的数值,这题难度稍大,有几个难点。

答案如下:

 

其中,函数 walk 用递归方法遍历二叉树

在 walk 的外面再包裹一层 Walk 是为了 close(ch)

而 close(ch) 是为了判断这棵树是否已经遍历完毕,以便结束循环。

 

注意,上面这个答案有个小问题,在官方答案里有这样的备注:

NOTE: The implementation leaks goroutines when trees are different.

其原因是这样的,首先,两棵树所包含的数值全部被读取并分别发送到 ch1 和 ch2 中,当两棵树包含的数值不相同时,上面程序中的 for 循环被中止并返回 false, 但是,此时被发送到 ch1 或/及 ch2 的数值还没有全部被接收,因此,它们会一直处于等待被接收的状态(在教程里有这样一句话:By default, sends and receives block until the other side is ready),以这种状态留存在内存中(占用内存),相当于内存泄漏。(当然,当这个程序关闭时,即可释放这部分内存,因此对于非长期运行的小程序来说问题不大。)

 

解决办法见官方答案:

https://github.com/golang/tour/blob/master/solutions/binarytrees_quit.go

 

参考相关讨论:

https://groups.google.com/forum/#!topic/golang-nuts/gva8SmZGmek

 

转载于:https://www.cnblogs.com/ahui2017/p/6383616.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值