📜  迭代后序遍历 |设置 3(1)

📅  最后修改于: 2023-12-03 15:41:56.404000             🧑  作者: Mango

迭代后序遍历 | 设置 3

简介

在树的遍历中,后序遍历是指先遍历左子树,再遍历右子树,最后遍历根节点。在递归实现中,后序遍历非常简单,但是在非递归实现中,需要使用一些辅助数据结构来实现。

本文介绍一种使用栈和标记的方法来实现后序遍历,并设置一个标记来标识是否正在访问右子树。

实现
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def postorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    
    stack = []
    node = root
    result = []
    
    while stack or node:
        while node:
            stack.append(node)
            node = node.left
        
        node = stack[-1]
        if node.right and node.right.val != "flag":
            stack.append(TreeNode("flag"))
            node = node.right
        else:
            result.append(node.val)
            stack.pop()
            node = None
        
    return result
解析

根据后序遍历的定义,先处理左子树和右子树。使用栈来保存节点,并判断是否存在右子树。如果存在右子树且未访问过,则将右子树节点设置为标记,再入栈;否则就可以访问右子树节点了。

总结

本文介绍了一种使用栈和标记的非递归方法实现后序遍历。该方法使用了一个标记来标识是否正在访问右子树,使得代码实现比较简洁明了。