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

LeetCode 1372:两段最长交错路径求解代码为何结果不同?

问题原因分析

核心问题在于变量复用的一致性被破坏,或是修改时误改了递归逻辑的关键参数:

1. 原代码的逻辑基础

假设你的原代码是这类常见的递归写法:

def longestZigZag(root):
    res = 0
    def dfs(node, is_left, cnt):
        nonlocal res
        if not node:
            return
        # 用l_path同时更新最大值和传递递归参数
        if is_left:
            l_path = cnt + 1
            res = max(res, l_path)
            dfs(node.right, False, l_path)  # 传递l_path保证路径长度累计正确
            dfs(node.left, True, 1)
        else:
            r_path = cnt + 1
            res = max(res, r_path)
            dfs(node.left, True, r_path)
            dfs(node.right, False, 1)
    dfs(root, True, 0)
    dfs(root, False, 0)
    return res

这里l_path(或r_path)承担两个关键作用:

  • 作为当前路径的长度,更新全局的最长路径值res
  • 作为递归调用的参数,把当前累计的路径长度传递给子节点,保证后续节点能正确延续路径计数

2. 修改后出错的关键

当你把赋值给l_path的表达式cnt+1直接传入max函数时,若没有同步修改递归调用的参数(比如仍然用cnt而非cnt+1),就会导致递归传递的长度值错误:

# 错误的修改示例:只改了max的参数,没改递归参数
if is_left:
    res = max(res, cnt + 1)
    dfs(node.right, False, cnt)  # 这里应该传cnt+1,却传了cnt
    dfs(node.left, True, 1)

在你的测试用例中:

  • 原代码遍历到第三层左节点时,会以cnt+1=2作为参数调用其右子节点,此时res被更新为正确的2
  • 修改后的代码传递的是cnt=1,进入第四层右节点时只能把res更新到1,最终返回错误结果

3. 另一种可能的错误场景

如果你的原代码是基于返回值的递归写法(用返回值表示当前节点向左/向右的最长路径),那错误可能是你在max函数中误用了相反方向的状态值:比如原代码中l_path = left_right + 1(左子节点的右路径长度+1),修改时误写成left_left + 1,导致当前节点的路径长度计算错误,全局最大值无法正确更新到2。

内容的提问来源于stack exchange,提问作者JobHunter69

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:34:51