• + 17 comments

    Solution Explained (With code)

    Note: testcases have been changed for this problem. Hence, the prev. approach shown in popular comments doesn't work.

    I'm implementing the tree node with an extra variable called 'node level'. An example of the new tree looks like this:

    Vertical-_Order-_Sum-_Implementation.png

    Here's my code with suitable comments in Java

       //new class to store level of each node along with the node 
       static class QueueNode{
            Node node;
            int level;
            public QueueNode(Node node, int level){
                this.node = node;
                this.level = level;
            }
        }
    
    
        public static void topView(Node root) {
            //took a queue - similar to BFS approach
            Queue<QueueNode> queue = new LinkedList<QueueNode>();
           
            //Taking a TreeMap<first, second>
            //first - stores the level of the node
            //second - stores the node.data
            TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
    	//why TreeMap? Because I want the nodes to be sorted from leftmost to rightmost
            
            //start (since root, level = 0)
            queue.add(new QueueNode(root, 0));
            
            while(!queue.isEmpty()){
                //remove element from queue
                QueueNode r = queue.poll();
                //if the level of this node has never been reached before -> visible in top view
                if(!map.containsKey(r.level)){
                    map.put(r.level, r.node.data);
                }
                
                //add node's descendants
                //all left child node levels = node.level - 1
                //all right child node levels = node.level + 1
                if(r.node.left != null){
                    queue.add(new QueueNode(r.node.left, r.level - 1));
                }
                if(r.node.right != null){
                    queue.add(new QueueNode(r.node.right, r.level + 1));
                }
            }
            //since already sorted (cuz TreeMap), print from left to right
            for (Integer value : map.values()) {
                System.out.print(value + " ");
            }
        }
    

    I've written a blog post about this problem here: Trees: Top View of a Tree

    Please upvote this comment if helpful. Thanks! :)