TODO: 987. Vertical Order Traversal of a Binary Tree

#binary-tree

Problem

https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/description/

Intuition

Time Complexity

O(n) - BFS
(O(vLevels) * O(log k)) +  (O(colLevels) * O(log k)) - Insertion of values into TreeMaps
O(vLevels) * (O(colLevels) * O(log k))- Processing the values in map for vertical and col level

k-> number of values in each colLevel
O(log k) -> Time complexity for sorting values

Total = O(n) + (O(vLevels) * (O(colLevels) * O(log k)))

Space Complexity

O(vLevel) * O(colLevel) -> To store values in Map
O(n) -> Storing values in result

Solution

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> verticalTraversal(TreeNode root) {
        // Time Complexity:
        // O(n) - BFS
        // O(vLevels) O(log k) * O(colLevels) * O(log k) - Insertion of values into TreeMaps
        // O(vLevels) * (O(colLevels) * O(log k))- Processing the values in map for vertical and col level
        // k-> number of values in each colLevel
        // O(log k) -> Time complexity for sorting values
        // Total = O(n) + (O(vLevels) * (O(colLevels) * O(log k)))

        // Space Complexity:
        // O(vLevel) * O(colLevel) -> To store values in Map
        // O(n) -> Storing values in result

        // Store the result
        List<List<Integer>> result = new ArrayList<>();

        // Handle edge case
        if(root==null) {
            return result;
        }

        // Map to store <VerticalLevel, <ColumnLevel, Values>>
        Map<Integer,Map<Integer,List<Integer>>> map = new TreeMap<>();
        // Queue to store the level order traversal
        Queue<Pair<Integer,TreeNode>> q = new ArrayDeque<>();

        q.offer(new Pair(0,root));// Add the root node

        int col = 0; // Keep track of level

        while(!q.isEmpty()) {
            int size = q.size();
            for(int i=0;i<size;++i) {
                Pair<Integer,TreeNode> pair = q.poll(); // Poll the node for processing
                int vLevel = pair.getKey(); // Vertical Level
                TreeNode node = pair.getValue(); // Node

                // Add nodes to queue for processing
                if(node.left!=null) {
                    q.offer(new Pair(vLevel-1,node.left));
                }
                if(node.right!=null) {
                    q.offer(new Pair(vLevel+1,node.right));
                }
                
                // Create a tmp map to store the column level info with values
                // The treemap ensures column in ascending manner is preserved
                Map<Integer,List<Integer>> tmp = new TreeMap<Integer,List<Integer>>();
                map.putIfAbsent(vLevel,tmp); // Add tmp if no vlevel is there
                map.get(vLevel).putIfAbsent(col,new ArrayList<>()); // Add new col with array list if not present
                map.get(vLevel).get(col).add(node.val); // Add the value to vertical -> column levels
            }
            ++col; // Increment the column (here col refers to x-axis)
        }

        // Process the map for building the result
        // The treemap ensures the vertical order in ascending manner is preserved
        for(Map<Integer,List<Integer>> tmp : map.values()) {
            List<Integer> lst = new ArrayList<>(); // Create a lst to store the vLevel values
            
            // Process the column level values
            for(List<Integer> tmp1 : tmp.values()) { 
                Collections.sort(tmp1); // Sort the values in same col level
                lst.addAll(tmp1);
            }
            result.add(lst); // Add to list
        }
        return result;
    }
}

Last updated

Was this helpful?