import java.util.*;
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int val) { this.val = val; }
}
public class VerticalOrderTraversal {
static class NodeInfo {
int row, val;
NodeInfo(int row, int val) {
this.row = row;
this.val = val;
}
}
public static List<List<Integer>> verticalTraversal(TreeNode root) {
// Map column -> list of (row, val)
TreeMap<Integer, List<NodeInfo>> map = new TreeMap<>();
dfs(root, 0, 0, map);
List<List<Integer>> result = new ArrayList<>();
for (int col : map.keySet()) {
List<NodeInfo> nodes = map.get(col);
// Sort by row, then val
nodes.sort((a, b) -> a.row != b.row ? a.row - b.row : a.val - b.val);
List<Integer> colVals = new ArrayList<>();
for (NodeInfo ni : nodes) {
colVals.add(ni.val);
}
result.add(colVals);
}
return result;
}
private static void dfs(TreeNode node, int col, int row, TreeMap<Integer, List<NodeInfo>> map) {
if (node == null) return;
map.computeIfAbsent(col, k -> new ArrayList<>()).add(new NodeInfo(row, node.val));
dfs(node.left, col - 1, row + 1, map);
dfs(node.right, col + 1, row + 1, map);
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right.right = new TreeNode(6);
List<List<Integer>> verticalOrder = verticalTraversal(root);
for (List<Integer> col : verticalOrder) {
for (int val : col) {
System.out.print(val + " ");
}
System.out.println();
}
}
}map.computeIfAbsent(col, k -> new ArrayList<>()).add(new NodeInfo(row, node.val));
Add current node info to the list for its column
dfs(node.left, col - 1, row + 1, map);
Traverse left child one column left and one row down
dfs(node.right, col + 1, row + 1, map);
Traverse right child one column right and one row down
nodes.sort((a, b) -> a.row != b.row ? a.row - b.row : a.val - b.val);
Sort nodes in column by row, then by value if rows tie