[leetcode] post-order traversal of binary tree

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

Guess you like

Origin blog.csdn.net/ningmengzhihe/article/details/127833343