LeetCode-Problems / 0145. Binary Tree Postorder Traversal / 0145. Binary Tree Postorder Traversal.py
0145. Binary Tree Postorder Traversal.py
Raw
"""04-21-2022 LeetCode 145. Binary Tree Postorder Traversal"""

# 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]:
        # if not root:
        #     return None #base case
        # stack = []
        # output = []
        # lastVisit = None #keeps track of right leaves we've already seen
        # while root or stack:
        #     while root:     #stack all left nodes
        #         stack.append(root)
        #         root = root.left
        #     nodePeak = stack[-1] #peak is last pushed
        #     if not nodePeak.right or nodePeak.right == lastVisit: #SKIP if right nodes we havent seen
        #         root = stack.pop()
        #         output.append(root.val) #otherwise weve reached a new leaf, add it to output
        #         lastVisit = root #move seen leaves pointer up to its parent
        #         root = None #weird tricky way to work back up to unpushed brances higher up
        #     else:
        #         root = nodePeak.right # Push right nodes, repeat until leaf right
        # return output
        return (
            self.postorderTraversal(root.left)
            + self.postorderTraversal(root.right)
            + [root.val]
            if root
            else []
        )

    # cool version using a tuple attached to each terminal leaf noting if we've seen it
    # if not root:
    #   return []


#             res=[]
#             stack=[(root,False)]

#             while stack:
#                 node,visited=stack.pop()
#                 if visited:
#                     res.append(node.val)
#                 else:
#                     stack.append((node,True))
#                     if node.right:
#                         stack.append((node.right,False))
#                     if node.left:
#                         stack.append((node.left,False))


#             return res