📅  最后修改于: 2023-12-03 15:41:56.404000             🧑  作者: Mango
在树的遍历中,后序遍历是指先遍历左子树,再遍历右子树,最后遍历根节点。在递归实现中,后序遍历非常简单,但是在非递归实现中,需要使用一些辅助数据结构来实现。
本文介绍一种使用栈和标记的方法来实现后序遍历,并设置一个标记来标识是否正在访问右子树。
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
根据后序遍历的定义,先处理左子树和右子树。使用栈来保存节点,并判断是否存在右子树。如果存在右子树且未访问过,则将右子树节点设置为标记,再入栈;否则就可以访问右子树节点了。
本文介绍了一种使用栈和标记的非递归方法实现后序遍历。该方法使用了一个标记来标识是否正在访问右子树,使得代码实现比较简洁明了。