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

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

代码逻辑解释

  1. 外层循环:每次剪枝后标记has_pruned为True,触发新一轮遍历,确保所有因剪枝产生的新0叶子节点都被处理。
  2. 后序遍历模拟:用visited标记区分第一次弹出(未处理子节点)和第二次弹出(已处理完左右子树),保证处理顺序和递归一致——先左、后右、再当前节点。
  3. 父节点跟踪:每个栈元素记录父节点和当前节点的位置(左/右),这样找到要剪的节点时,能准确修改父节点的指针。

测试你的示例

把你给出的示例树输入这个函数,它会:

  • 先处理最底层的0叶子节点(两个0和左子树的0),把它们剪掉
  • 然后触发新一轮遍历,处理中间层的0节点(此时它已经变成叶子节点),剪掉它
  • 最后剩下的就是你想要的结果树

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:02:49