Python实现二叉树剪枝:后序遍历方法失效问题求助
二叉树剪枝的迭代后序遍历实现方案
嗨,我来帮你搞定这个迭代版的二叉树剪枝问题!你的递归写法非常漂亮,完全符合自底向上的剪枝逻辑——先处理左右子树,再判断当前节点是否需要保留。那为什么迭代版的后序遍历容易出问题呢?主要是因为剪枝操作可能会产生新的、符合剪枝条件的叶子节点,一次遍历往往无法处理干净,而且迭代过程中需要准确跟踪父节点,才能正确修改子节点的指针。
你可能遇到的问题分析
普通的后序遍历只会遍历每个节点一次,但剪枝后(比如把某个0叶子节点删掉),它的父节点可能变成新的0叶子节点,这时候需要再次检查处理。另外,如果没有记录父节点和当前节点是左/右子节点,你根本不知道该修改父节点的哪个指针。
正确的迭代实现代码
下面是一个和递归逻辑对齐的迭代版本,用栈模拟后序遍历,同时处理剪枝后的重复检查:
def pruneTree_iterative(root): if not root: return None # 栈元素:(当前节点, 父节点, 是否已访问过) stack = [(root, None, False)] # 标记是否有节点被剪枝,用来触发新一轮遍历 has_pruned = True # 循环处理直到没有节点可剪 while has_pruned: has_pruned = False stack = [(root, None, False)] while stack: node, parent, visited = stack.pop() if not visited: # 后序遍历:先标记为已访问,再压入右、左子节点 stack.append((node, parent, True)) if node.right: stack.append((node.right, node, False)) if node.left: stack.append((node.left, node, False)) else: # 检查当前节点是否是值为0的叶子节点 if node.val == 0 and not node.left and not node.right: has_pruned = True if parent: # 修改父节点的对应指针 if parent.left == node: parent.left = None else: parent.right = None else: # 如果根节点就是要剪的,直接返回None return None return root
代码逻辑解释
- 外层循环:每次剪枝后标记
has_pruned为True,触发新一轮遍历,确保所有因剪枝产生的新0叶子节点都被处理。 - 后序遍历模拟:用
visited标记区分第一次弹出(未处理子节点)和第二次弹出(已处理完左右子树),保证处理顺序和递归一致——先左、后右、再当前节点。 - 父节点跟踪:每个栈元素记录父节点和当前节点的位置(左/右),这样找到要剪的节点时,能准确修改父节点的指针。
测试你的示例
把你给出的示例树输入这个函数,它会:
- 先处理最底层的0叶子节点(两个0和左子树的0),把它们剪掉
- 然后触发新一轮遍历,处理中间层的0节点(此时它已经变成叶子节点),剪掉它
- 最后剩下的就是你想要的结果树
内容的提问来源于stack exchange,提问作者codingBoy
相关产品推荐
相关产品推荐

