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
相关产品推荐
相关产品推荐

