All Traversal


Breadth First Search / Level Order

102. Binary Tree Level Order Traversal (Medium)

def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
    def recursion(node):
        nonlocal cur_depth
        if node:
            cur_depth += 1
            hm[cur_depth].append(node.val)
            recursion(node.left)
            recursion(node.right)
            cur_depth -= 1

    cur_depth = 0
    hm = defaultdict(list)
    recursion(root)
    return list(hm.values())

107. Binary Tree Level Order Traversal II (Medium)

def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
    def recursion(node):
        nonlocal cur_depth
        if node:
            cur_depth += 1
            hm[cur_depth].append(node.val)
            recursion(node.left)
            recursion(node.right)
            cur_depth -= 1

    cur_depth = 0
    hm = defaultdict(list)
    recursion(root)
    return reversed(list(hm.values()))

103. Binary Tree Zigzag Level Order Traversal (Medium)

def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
    isEven = lambda x: x % 2 == 0

    def recursion(node):
        nonlocal level
        if node:
            level += 1
            if isEven(level):
                hm[level].append(node.val)
            else:
                hm[level].insert(0, node.val)
            recursion(node.left) if node.left else None
            recursion(node.right) if node.right else None
            level -= 1

    level = -1
    hm = collections.defaultdict(list)
    recursion(root)
    return list(hm.values())

Vertical Order

987. Vertical Order Traversal of a Binary Tree (Hard)

def verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:
    def recursion(node):
        nonlocal hm, col, row, min_col, max_col
        if node:
            # Get the range of the column number
            min_col = min(min_col, col)
            max_col = max(max_col, col)
            # Append val into [col][row]
            hm[col][row] = hm[col].get(row, []) + [node.val]
            # Preorder (go left)---------------------
            col, row = col - 1, row + 1  # a
            recursion(node.left)
            col, row = col + 1, row - 1  # a backtrack
            # Preorder (go right) -------------------
            col, row = col + 1, row + 1  # b
            recursion(node.right)
            col, row = col - 1, row - 1  # b backtrack

    hm = defaultdict(dict)
    min_col = max_col = col = row = 0
    recursion(root)
    # Extract the list of values by sorting the list based on <row,value>
    ans = []
    for col in range(min_col, max_col + 1):
        ans.append([j for row in sorted(hm[col]) for j in sorted(hm[col][row])])
    return ans

314. Binary Tree Vertical Order Traversal (Medium)

def verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
    def recursion(node):
        nonlocal hm, col, row, min_col, max_col
        if node:
            # Get the range of the column number
            min_col = min(min_col, col)
            max_col = max(max_col, col)
            # Append val into [col][row]
            hm[col][row] = hm[col].get(row, []) + [node.val]
            # Preorder (go left)---------------------
            col, row = col - 1, row + 1  # a
            recursion(node.left)
            col, row = col + 1, row - 1  # a inverted
            # Preorder (go right) -------------------
            col, row = col + 1, row + 1  # b
            recursion(node.right)
            col, row = col - 1, row - 1  # b inverted

    hm = defaultdict(dict)
    min_col = max_col = col = row = 0
    recursion(root)
    # Extract the list of values by sorting the list based on <row,value>
    ans = []
    for col in range(min_col, max_col + 1):
        ans.append([j for row in sorted(hm[col]) for j in hm[col][row]])
    return ans if root else []