为何Python函数执行return后仍继续运行?二叉树层序遍历代码问题
问题分析与解决方案
核心原因
return 语句只会终止当前所在的函数/递归调用栈帧,不会直接终止整个外层函数或所有递归分支的执行。比如你在某个递归子调用里写了return,父调用的代码会继续往下执行;如果是在嵌套函数里return,外层函数的后续代码也会正常运行。你的报错就是因为return之后,仍有代码在访问一个None类型节点的val属性。
常见出错场景
递归调用后未判断节点有效性
比如你在父调用中传递了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)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)
修复方案
所有访问
node.val的操作前必须判空
无论递归还是迭代,确保只有非None的节点才会被访问val属性。递归写法的正确示例
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更稳妥的迭代写法(队列实现)
迭代法从根源避免了递归中容易出现的栈帧问题,且能明确控制节点入队的有效性: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
相关产品推荐
相关产品推荐

