Given a binary tree of integers. The task is to return an array of integers representing the bottom view of the Binary tree.
Bottom view of a Binary Tree: is a set of nodes visible when the tree is visited from the bottom.
Examples:
Input:
Output: [8, 4, 9, 5, 3, 7]
Explanation:
Input:
Output: [1, 3, 2]
Hashmap and Recursion Approach
The bottom view of a binary tree refers to the bottommost nodes present at the same level.
Algorithm
- Perform a preorder traversal to calculate the level of each node of the binary tree.
- Consider a hashmap and store the height into the map, where the key is the level or the horizontal distance of the ith node and the value is a pair (p, q), where p is the value of the node and q is the height of the node.
- For every node:
- Add the node to the resultant map if it is the first node to have the current horizontal distance.
- Else, if a node is already present for the particular distance, replace the previous node with the current node, if the node has a height greater than the previous node.
C++ Code
void bottomview(Tree * root, map<int,vector<int>>& m, int lev, int h_dist){ if (root == NULL) return; if (m.find(h_dist) == m.end()) { m[h_dist].push_back(lev); m[h_dist].push_back(root -> data); } else { if (m[h_dist][0] <= lev) { m[h_dist][0] = lev; m[h_dist][1]= root -> data; } } // Calling the function for the right and left subtrees // with the appropriate parameters. bottomview(root -> left, m, lev + 1, h_dist - 1); bottomview(root -> right, m, lev + 1, h_dist + 1); } Void print_bottom_of_binary_tree(Tree* root){ map<int,vector<int>> Map; bottomview(root, Map, 1, 0); for (auto it = Map.begin(); it != Map.end(); ++it) { cout << (it-> second)[1]<< " "; } }
Java Code
bottomview(Node root, TreeMap<Integer, int[]> m, int curr, int hd) { if (root == null) return; if (!m.containsKey(hd)) { m.put(hd, new int[]{ root.data, curr }); } else { int[] p = m.get(hd); if (p[1] <= curr) { p[1] = curr; p[0] = root.data; } m.put(hd, p); } printBottomViewUtil(root.left, curr + 1, hd - 1, m); printBottomViewUtil(root.right, curr + 1,hd + 1, m); } print_bottom_of_binary_tree(Node root) { TreeMap<Integer, int[]> m = new TreeMap<>(); printBottomViewUtil(root, 0, 0, m); for(int val[] : m.values()) { System.out.print(val[0] + " "); } }
Python Code
def print_bottom_of_binary_tree(root): d = dict() printBottomViewUtil(root, d, 0, 0) for i in sorted(d.keys()): print(d[i][0], end = " ") def bottomview(root, d, hd, level): if root is None: return if hd in d: if level >= d[hd][1]: d[hd] = [root.data, level] else: d[hd] = [root.data, level] bottomview(root.left, d, hd - 1,level + 1) bottomview(root.right, d, hd + 1,level + 1)
Time Complexity: O(N) where N is the number of nodes of the binary tree.
Space Complexity: O(N), as a map is used.
Queue Approach
The approach is to perform a level order traversal of the given binary tree and store them in a queue. Also, consider a map, which stores the horizontal distance of the nodes from root as the key.
Algorithm
- Initialise a queue to store the nodes on performing level order traversal.
- Push the root of the binary tree into the queue along with its horizontal distance(hd), which is 0.
- Keep on pushing the left child to the queue along with their horizontal distance as hd – 1 and right child as hd + 1.
- While the queue is not empty, perform the following operations:
- Store the front element of the queue is a variable, say, res.
- Pop the element.
- Put the dequeued element, stored in res and update its value in the map.
- If a left child is present, push the left child into the queue along with its horizontal distance as hd – 1.
- If a right child is present, push the right child into the queue along with its horizontal distance as hd + 1.
- Print the values in the map which contains the bottom key of the binary tree.
C++ Implementation of Queue Method
void bottomview(Tree * root){ int horizontalDistance = 0; map<int, Tree*> mp; queue<pair<Tree*, int>> q; q.push({root, 0}); while (!q.empty()) { pair<BinaryTreeNode<int> *, int> p = q.front(); q.pop(); mp[p.second] = p.first; if (p.first->left != NULL) { q.push({p.first->left, p.second - 1}); } if (p.first->right != NULL) { q.push({p.first->right, p.second + 1}); } } for (auto i = mp.begin(); i != mp.end(); i++) { cout <<(i->second->data) <<” “; } }
Java Implementation of Queue Method
class Pair { Tree root; int level; Pair() { } Pair(Tree root, int level) { this.root = root; this.level = level; } } bottomView(BinaryTreeNode root) { int horizontalDistance = 0; ArrayList<Integer> ans = new ArrayList<>(); HashMap<Integer, BinaryTreeNode> mp = new HashMap<>(); Queue<Pair> q = new LinkedList<>(); Pair p1 = new Pair(root, 0); q.add(p1); while (!q.isEmpty()) { Pair p = q.poll(); mp.put(p.level, p.root); if (p.root.left != null) { q.add(new Pair(p.root.left, p.level - 1)); } if (p.root.right != null) { q.add(new Pair(p.root.right, p.level + 1)); } } ArrayList<Integer> bottomView = new ArrayList<>(); for (int key : mp.keySet()) { bottomView.add(key); } Collections.sort(bottomView); for (int i : bottomView) { System.out.print(mp.get(i).val + “ “); } } }
Python Implementation of Queue Method
class Pair: def __init__(self, root, level): self.root = root self.level = level def bottomView(root): horizontalDistance = 0 mp = OrderedDict() q = [] p1 = Pair(root, 0) q.append(p1) while len(q) > 0: p = q.pop(0) mp[p.level] = p.root if p.root.left is not None: q.append(Pair(p.root.left, p.level - 1)) if p.root.right is not None: q.append(Pair(p.root.right, p.level + 1)) bottomViewList = [] for key in mp.keys(): bottomViewList.append(key) bottomViewList.sort() for i in bottomViewList: print(mp.get(i).data, end = “ ”)
Time Complexity: O(N * log N) where N is the number of nodes of the binary tree.
Space Complexity: O(N), as a map is used.
Practice Questions
Vertical Order traversal of Binary Tree
Right view of Binary tree
Frequently Asked Questions
What is the left view of a binary tree?
The set of nodes visible when the tree is visited from the left is the left view of the binary tree.
How do you print the bottom of a binary tree?
The bottom view of a binary tree can be printed by hashing and level order traversal of the binary tree.
What is the diameter of a binary tree?
The diameter of a tree is the number of nodes on the longest path between two leaves in the tree