Go Tour等价二叉树练习:前序遍历等价判定失效问题
Go Tour等价二叉树练习前序遍历测试失败问题排查
问题根因
前序遍历(根-左-右)本身完全可以用于判断两棵二叉树是否等价,测试失败的核心原因是遍历代码的递归逻辑、通道处理存在错误,中序/逆中序遍历能通过只是巧合:
- 递归遍历逻辑存在路径错位:实现的遍历函数在递归传入左右子节点时,没有正确传递子树指针,导致遍历路径没有严格按照根→左→右的顺序走,两棵结构完全相同的树,遍历时因为递归传参错误走出了不同的节点访问顺序,最终输出的序列自然无法匹配。
- 通道关闭时机错误:在递归函数中直接触发通道关闭,子递归流程执行时就可能提前关闭通道,导致遍历序列被截断,进一步干扰对比结果。
- 中序(左-根-右)、右根左顺序能通过测试,完全是因为练习中生成的测试树都是二叉搜索树:中序遍历二叉搜索树必然得到严格递增的110序列,右根左遍历必然得到严格递减的101序列,只要遍历能输出对应有序序列,哪怕递归路径有问题也会碰巧通过测试,不代表代码逻辑正确。
修正方案
按照以下步骤调整代码即可:
- 拆分递归逻辑,避免子递归调用误关闭通道
不要把通道关闭逻辑写在会被递归调用的函数里,用闭包包裹实际的递归遍历逻辑,仅在最外层Walk函数返回时关闭通道,参考框架:func Walk(t *tree.Tree, ch chan int) { // 仅最外层调用结束时关闭通道 defer close(ch) // 内部递归函数,不处理通道关闭 var walker func(*tree.Tree) walker = func(node *tree.Tree) { if node == nil { return } // 前序顺序:当前节点→左子树→右子树 ch <- node.Value walker(node.Left) walker(node.Right) } walker(t) } - 修正Same函数逻辑
给两棵树的Walk函数分别分配独立的通道,启动两个goroutine分别执行遍历,循环从两个通道同步读取值对比:只要任意一个通道提前关闭、同位置读取的值不相等就直接返回false,两个通道都正常读完10个值且全部匹配时返回true。 - 验证修正结果
修正后无论使用前序、中序、后序哪种遍历顺序,只要遍历逻辑严格遵循访问规则,都能正确判断二叉树等价性。
内容的提问来源于stack exchange,提问作者the_sky_is_pink
相关产品推荐
相关产品推荐

