Print Nodes in Top View of Binary Tree - GeeksforGeeks
Top view of a binary tree is the set of nodes visible when the tree is viewed from the top. Given a binary tree, print the top view of it. The output nodes can be printed in any order. Expected time complexity is O(n)
A node x is there in output if x is the topmost node at its horizontal distance. Horizontal distance of left child of a node x is equal to horizontal distance of x minus 1, and that of right child is horizontal distance of x plus 1.
http://www.ideserve.co.in/learn/top-view-of-a-binary-tree-using-level-order-traversal
http://algorithms.tutorialhorizon.com/print-the-top-view-of-a-binary-tree/
Read full article from Print Nodes in Top View of Binary Tree - GeeksforGeeks
Top view of a binary tree is the set of nodes visible when the tree is viewed from the top. Given a binary tree, print the top view of it. The output nodes can be printed in any order. Expected time complexity is O(n)
A node x is there in output if x is the topmost node at its horizontal distance. Horizontal distance of left child of a node x is equal to horizontal distance of x minus 1, and that of right child is horizontal distance of x plus 1.
// A class to represent a queue item. The queue is used to do Level// order traversal. Every Queue item contains node and horizontal// distance of node from rootclass QItem{ TreeNode node; int hd; public QItem(TreeNode n, int h) { node = n; hd = h; }}// Class for a Binary Treeclass Tree{ TreeNode root; // Constructors public Tree() { root = null; } public Tree(TreeNode n) { root = n; } // This method prints nodes in top view of binary tree public void printTopView() { // base case if (root == null) { return; } // Creates an empty hashset HashSet<Integer> set = new HashSet<>(); // Create a queue and add root to it Queue<QItem> Q = new LinkedList<QItem>(); Q.add(new QItem(root, 0)); // Horizontal distance of root is 0 // Standard BFS or level order traversal loop while (!Q.isEmpty()) { // Remove the front item and get its details QItem qi = Q.remove(); int hd = qi.hd; TreeNode n = qi.node; // If this is the first node at its horizontal distance, // then this node is in top view if (!set.contains(hd)) { set.add(hd); System.out.print(n.key + " "); } // Enqueue left and right children of current node if (n.left != null) Q.add(new QItem(n.left, hd-1)); if (n.right != null) Q.add(new QItem(n.right, hd+1)); } }} class TreeNode { TreeNode left; TreeNode right; int val; public TreeNode(int x) { this.val = x; } } TreeNode root; class QueueEntry { TreeNode node; int horizontalDistFromRoot; public QueueEntry (TreeNode node, int distance) { this.node = node; this.horizontalDistFromRoot = distance; } } private void fillUpViewMap(TreeNode root, Map viewMap) { if (root == null) return; LinkedList<QueueEntry> queue = new LinkedList(); queue.add(new QueueEntry(root, 0)); while (!queue.isEmpty()) { QueueEntry currentNode = queue.remove(); Integer mapEntry = (Integer)viewMap.get(currentNode.horizontalDistFromRoot); // if node exists in viewMap at this same horizontal distance // then we cannot add this node into viewMap. if (mapEntry == null) { viewMap.put(currentNode.horizontalDistFromRoot, currentNode.node.val); } // We don't add null nodes into the queue if (currentNode.node.left != null) queue.add(new QueueEntry(currentNode.node.left, currentNode.horizontalDistFromRoot - 1)); if (currentNode.node.right != null) queue.add(new QueueEntry(currentNode.node.right, currentNode.horizontalDistFromRoot + 1)); } } private void printTopView() { Map<Integer, Integer> viewMap = new TreeMap<>(); fillUpViewMap(root, viewMap); // print map entries to print the top view Iterator<Entry<Integer, Integer>> iterator = viewMap.entrySet().iterator(); while (iterator.hasNext()) { Entry<Integer, Integer> nodeEntry = iterator.next(); System.out.print(" " + nodeEntry.getValue()); } }Read full article from Print Nodes in Top View of Binary Tree - GeeksforGeeks