Use BFS with column tracking. Start a queue with (root, column 0). For each node, add it to a dictionary keyed by column number. Push left child with column - 1 and right child with column + 1.
Why BFS and not DFS? BFS processes nodes level by level, left to right. This guarantees the correct order within each column without extra sorting. DFS would visit deeper nodes before same-level siblings, breaking the top-to-bottom requirement.
After BFS finishes, sort the dictionary by column number and return the values.