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

递归二叉树路径计算函数转迭代实现的可行性与方法咨询

递归转迭代的实现方案

这段递归代码完全可以通过迭代实现来提升效率,而且实现方式非常清晰优雅。递归版本存在大量重复计算(不同路径会到达相同的(l, r, cur_height)状态),迭代方式可以避免重复计算,同时消除递归调用的栈开销,在max_height较大时效率提升会很明显。

核心思路分析

递归的本质是从顶层(cur_height=0)向下遍历所有可能的左/右转向路径,最终汇总底层的计算结果。我们可以反过来,从最底层(cur_height = max_height)开始向上计算,用存储结构记录每一层每个状态的结果,逐层推导到顶层:

  • 当cur_height = max_height时,所有满足l + r = max_height的(l, r)状态,其值为f(l, r) * (f(l+1, r) + f(l, r+1))(对应递归的终止条件)。
  • 对于cur_height < max_height的状态,每个(l, r)(满足l + r = cur_height)的值,等于下一层(cur_height+1)中(l+1, r)和(l, r+1)的结果之和(对应递归的分支求和逻辑)。

迭代实现代码

def iterative_travel(max_height):
    # 初始化最底层(cur_height = max_height)的状态
    # 该层l的范围是0到max_height,r = max_height - l
    next_layer = []
    for l in range(max_height + 1):
        r = max_height - l
        val = f(l, r) * (f(l+1, r) + f(l, r+1))
        next_layer.append(val)
    
    # 从cur_height = max_height -1 向上推导到cur_height=0
    for h in range(max_height - 1, -1, -1):
        current_layer = []
        # 该层l的范围是0到h,r = h - l
        for l in range(h + 1):
            # 当前(l,r)的值 = 下一层的(l+1, r) + 下一层的(l, r+1)
            # 下一层中,(l+1, r)对应索引l+1,(l, r+1)对应索引l
            val = next_layer[l+1] + next_layer[l]
            current_layer.append(val)
        next_layer = current_layer
    
    # 最终next_layer仅存一个元素,对应初始调用(0,0,0,n)的结果
    return next_layer[0]

代码说明

  1. 底层初始化:先计算所有max_height层的状态值,存储在next_layer列表中,列表索引直接对应l的值,r由max_height - l推导得出,无需额外存储。
  2. 逐层向上推导:从倒数第二层开始,每一层的每个状态值都依赖下一层的两个相邻状态值,计算后存入current_layer,再将next_layer更新为当前层,继续向上推导。
  3. 空间优化:这里仅用两个一维列表(current_layer和next_layer),相比二维数组存储所有层的方式,空间复杂度从O(n²)优化到了O(n),高效且简洁。

验证与调用

调用方式直接传入max_height即可,和递归的初始调用recursive_travel(0,0,0,n)结果完全一致:

# 示例f函数,可替换为实际业务逻辑
def f(l, r):
    return l + r

n = 3
print(iterative_travel(n))  # 结果与recursive_travel(0,0,0,n)完全相同

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:14