recursion
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# Solution 1: 递归
res = []
def dfs(root:Optional[TreeNode]):
if root == None:
return
dfs(root.left)
dfs(root.right)
res.append(root.val)
dfs(root)
return res
Iteration: slightly different from in-order traversal and pre-order traversal
Add an auxiliary variable preNode to record the node visited in the last round to judge whether the right of the current node is the node visited in the last round
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# Solution 2: 迭代
res = []
stack = []
preNode = None
while root!=None or stack!=[]:
while root:
stack.append(root)
root = root.left
root = stack.pop()
# Note(1)
if root.right == None or root.right == preNode:
res.append(root.val)
preNode = root
root = None
else:
# Note(2)如果当前节点的右子树还没有被访问过,那么当前节点还要再次入栈
stack.append(root)
root = root.right
return res