You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:39:40