package com.interview.tree; import java.util.*; /** * Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bottom, column by column). * If two nodes are in the same row and column, the order should be from left to right. * * https://leetcode.com/problems/binary-tree-vertical-order-traversal/ */ public class VerticalOrder { public List<List<Integer>> verticalOrder(Node root) { if (root == null) { return new ArrayList<>(); } int minVal = 0; int maxVal = 0; Map<Integer, List<Integer>> map = new HashMap<>(); Deque<Node> queue = new LinkedList<>(); Deque<Integer> verticalQueue = new LinkedList<>(); queue.offerFirst(root); verticalQueue.offerFirst(0); int vertical; while (!queue.isEmpty()) { root = queue.pollFirst(); vertical = verticalQueue.pollFirst(); minVal = Math.min(minVal, vertical); maxVal = Math.max(maxVal, vertical); List<Integer> r = map.get(vertical); if (r == null) { r = new ArrayList<>(); map.put(vertical, r); } r.add(root.data); if (root.left != null) { queue.offerLast(root.left); verticalQueue.offerLast(vertical - 1); } if (root.right != null) { queue.offerLast(root.right); verticalQueue.offerLast(vertical + 1); } } List<List<Integer>> result = new ArrayList<>(); for (int i = minVal; i <= maxVal; i++) { List<Integer> r = map.get(i); result.add(r); } return result; } }