tree November 28, 2022

Binary tree vertical order traversal

Time O(n) Space O(n) Open original problem

We will use BFS to traverse the tree. We will keep track of the horizontal distance of each node from the root. We will use a dictionary to store the nodes at each horizontal distance. We will use a queue to traverse the tree. We will use a set to keep track of the horizontal distances of the nodes. We will use a list to store the result.

# 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 verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []

        cols = collections.defaultdict(list)
        q = collections.deque([(root, 0)])
        while q:
            qLen = len(q)
            for _ in range(qLen):
                node, col = q.pop()
                cols[col].append(node.val)
                if node.left:
                    q.appendleft((node.left, col-1))
                if node.right:
                    q.appendleft((node.right, col+1))

        return [cols[i] for i in sorted(cols)]

Time complexity: O(n)
Space complexity: O(n)