Print Nodes in Top View of Binary Tree
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.
1
/ \
2 3
/ \ / \
4 5 6 7
Top view of the above binary tree is
4 2 1 3 7
1
/ \
2 3
\
4
\
5
\
6
Top view of the above binary tree is
2 1 3 6
Solution 1:
// Java program to print top view of Binary treeimport java.util.*;// Class for a tree nodeclass TreeNode{ // Members int key; TreeNode left, right; // Constructor public TreeNode(int key) { this.key = key; left = right = null; }}// 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)); } }}// Driver class to test above methodspublic class Main{ public static void main(String[] args) { /* Create following Binary Tree 1 / \ 2 3 \ 4 \ 5 \ 6*/ TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.right = new TreeNode(4); root.left.right.right = new TreeNode(5); root.left.right.right.right = new TreeNode(6); Tree t = new Tree(root); System.out.println("Following are nodes in top view of Binary Tree"); t.printTopView(); }}
Solution 2:
public void printTopView(Node root,int hd) { if(root==null) return; if(!treemap.containsKey(hd)) { treemap.put(hd,root.data);} printTopView(root.left,hd-1); printTopView(root.right,hd+1); } |
No comments:
Post a Comment