Given a binary tree, return an array where elements represent the bottom view of the binary tree from left to right.
Note: If there are multiple bottom-most nodes for a horizontal distance from the root, then the latter one in the level traversal is considered. For example, in the below diagram, 3 and 4 are both the bottommost nodes at a horizontal distance of 0, here 4 will be considered.
20
/ \
8 22
/ \ / \
5 3 4 25
/ \
10 14
For the above tree, the output should be 5 10 4 14 25.
Examples :
Input: 1 / \ 3 2 Output: 3 1 2 Explanation: First case represents a tree with 3 nodes and 2 edges where root is 1, left child of 1 is 3 and right child of 1 is 2.Thus bottom view of the binary tree will be 3 1 2.
Input: 10 / \ 20 30 / \ 40 60 Output: 40 20 60 30
Expected Time Complexity: O(n)
Expected Auxiliary Space: O(n)
Constraints:
1 <= Number of nodes <= 105
1 <= Data of a node <= 105
Approach 01:
-
C++
-
Python
#include <vector> #include <map> #include <queue> using namespace std; class Solution { public: vector<int> bottomView(Node* root) { vector<int> result; // To store the bottom view of the tree if (root == NULL) { return result; } map<int, int> horizontalDistanceMap; // To store the bottom-most node's value for each horizontal distance queue<pair<Node*, int>> nodeQueue; // To perform level-order traversal nodeQueue.push({root, 0}); // Start with the root node at horizontal distance 0 while (!nodeQueue.empty()) { pair<Node*, int> temp = nodeQueue.front(); nodeQueue.pop(); Node* currentNode = temp.first; int horizontalDistance = temp.second; // Update the bottom view map with the current node's value at the given horizontal distance horizontalDistanceMap[horizontalDistance] = currentNode->data; // Traverse the left subtree if (currentNode->left) { nodeQueue.push({currentNode->left, horizontalDistance - 1}); } // Traverse the right subtree if (currentNode->right) { nodeQueue.push({currentNode->right, horizontalDistance + 1}); } } // Collect the bottom view nodes from the map for (auto it : horizontalDistanceMap) { result.push_back(it.second); } return result; } };
from collections import deque class Solution: def bottomView(self, root): result = [] # To store the bottom view of the tree if root is None: return result horizontalDistanceMap = {} # To store the bottom-most node's value for each horizontal distance nodeQueue = deque([(root, 0)]) # To perform level-order traversal, starting with the root at horizontal distance 0 while nodeQueue: temp = nodeQueue.popleft() currentNode, horizontalDistance = temp # Update the bottom view map with the current node's value at the given horizontal distance horizontalDistanceMap[horizontalDistance] = currentNode.data # Traverse the left subtree if currentNode.left: nodeQueue.append((currentNode.left, horizontalDistance - 1)) # Traverse the right subtree if currentNode.right: nodeQueue.append((currentNode.right, horizontalDistance + 1)) # Collect the bottom view nodes from the map, sorted by horizontal distance for key in sorted(horizontalDistanceMap.keys()): result.append(horizontalDistanceMap[key]) return result
Time Complexity
-
Level-Order Traversal:
The function uses a queue to perform a level-order traversal of the binary tree, which takes \( O(n) \) time, where \( n \) is the number of nodes in the tree.
-
Updating Horizontal Distance Map:
Each node’s horizontal distance and value are updated in a map. Since updating and accessing elements in a map (red-black tree) takes \( O(\log n) \) time, the overall time complexity for this part is \( O(n \log n) \).
-
Collecting Results:
Finally, we iterate through the map to collect the results, which takes \( O(n) \) time.
-
Overall Time Complexity:
Combining these steps, the overall time complexity is \( O(n \log n) \).
Space Complexity
-
Auxiliary Space:
The space complexity for storing the map is \( O(n) \) since, in the worst case, we store one entry for each node.
-
Queue Space:
The space complexity for the queue used in level-order traversal is \( O(n) \) in the worst case when all nodes are in the queue.
-
Overall Space Complexity:
The overall space complexity is \( O(n) \).