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

为何Python函数执行return后仍继续运行?二叉树层序遍历代码问题

问题分析与解决方案

核心原因

return 语句只会终止当前所在的函数/递归调用栈帧,不会直接终止整个外层函数或所有递归分支的执行。比如你在某个递归子调用里写了return,父调用的代码会继续往下执行;如果是在嵌套函数里return,外层函数的后续代码也会正常运行。你的报错就是因为return之后,仍有代码在访问一个None类型节点的val属性。

常见出错场景

  1. 递归调用后未判断节点有效性
    比如你在父调用中传递了None节点给递归函数,递归函数里return后,父调用继续执行并尝试访问该None节点的val:

    def levelOrder(root):
        res = []
        def helper(node, level):
            if not node:
                return
            res[level].append(node.val)
        # 假设root.left是None
        helper(root.left, 1)
        # 递归return后,这里仍尝试访问None的val,直接报错
        res.append(root.left.val)
    
  2. return位置错误,后续代码仍访问节点
    比如你在递归函数的某个条件下提前return,但该条件没有覆盖节点为None的场景,或者return后仍有访问node.val的代码:

    def helper(node, level):
        if len(res) == level:
            res.append([])
            return  # 提前return,但后续代码仍会执行(如果node是None就会报错)
        res[level].append(node.val)
        helper(node.left, level+1)
        helper(node.right, level+1)
    

修复方案

  1. 所有访问node.val的操作前必须判空
    无论递归还是迭代,确保只有非None的节点才会被访问val属性。

  2. 递归写法的正确示例

    class Solution:
        def levelOrder(self, root):
            res = []
            def traverse(node, level):
                if not node:
                    return
                # 确保当前层级的列表存在
                if len(res) == level:
                    res.append([])
                res[level].append(node.val)
                traverse(node.left, level + 1)
                traverse(node.right, level + 1)
            traverse(root, 0)
            return res
    
  3. 更稳妥的迭代写法(队列实现)
    迭代法从根源避免了递归中容易出现的栈帧问题,且能明确控制节点入队的有效性:

    from collections import deque
    class Solution:
        def levelOrder(self, root):
            if not root:
                return []
            res = []
            queue = deque([root])
            while queue:
                level_size = len(queue)
                current_level = []
                for _ in range(level_size):
                    node = queue.popleft()
                    current_level.append(node.val)
                    # 只入队非None的子节点
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                res.append(current_level)
            return res
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:40:29