已修复二叉树后序遍历生成后缀表达式函数bug,未解根因及连续调用异常
问题分析与解决方案
根本原因定位
你遇到的连续调用postfix函数时结果追加的问题,核心原因几乎可以肯定是存储结果的列表没有在每次函数调用时重新初始化:
- 如果你把结果列表定义成了全局变量(比如函数外的
result = []),第一次调用后列表里已有内容,第二次调用后序遍历时会继续往同一个列表里追加元素; - 或者你在函数内部用了静态变量/闭包的错误写法(比如把列表定义在嵌套函数外层但没每次重置),导致列表的状态在多次调用间被保留了。
举个典型的错误写法(这就是你问题的根源):
# 错误写法:全局结果列表 result = [] def postfix(node): if node is None: return postfix(node.left) postfix(node.right) result.append(node.val) return result
第一次调用后result里有["a","1","+","1","+"],第二次调用时会继续往这个列表里加新的遍历结果,就出现了追加异常。
正确实现方式
要解决这个问题,只需要确保每次调用postfix函数时,都创建一个全新的列表来存储当前遍历的结果。这里提供两种常用的正确写法:
写法1:嵌套闭包初始化列表
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def postfix(node): # 每次调用postfix时,都新建一个空列表 result = [] def traverse(current_node): if not current_node: return # 后序遍历:左 -> 右 -> 根 traverse(current_node.left) traverse(current_node.right) result.append(current_node.val) traverse(node) return result
写法2:参数传递结果列表
这种写法更灵活,也避免闭包的依赖:
def postfix(node): def traverse(current_node, res): if not current_node: return traverse(current_node.left, res) traverse(current_node.right, res) res.append(current_node.val) # 每次调用时初始化新列表 result = [] traverse(node, result) return result
验证效果
对于你给出的表达式树((a+1)+1),构造对应的二叉树后,每次调用postfix(root)都会返回全新的列表["a","1","+","1","+"],连续调用也不会出现追加的异常。
内容的提问来源于stack exchange,提问作者Digitalis
相关产品推荐
相关产品推荐

