Given a binary tree and a node data called target. Find the minimum time required to burn the complete binary tree if the target is set on fire. It is known that in 1 second all nodes connected to a given node get burned. That is its left child, right child, and parent.
Note: The tree contains unique values.
Examples :
Input:
1
/ \
2 3
/ \ \
4 5 6
/ \ \
7 8 9
\
10
Target Node = 8
Output: 7
Explanation: If leaf with the value 8 is set on fire.
After 1 sec: 5 is set on fire.
After 2 sec: 2, 7 are set to fire.
After 3 sec: 4, 1 are set to fire.
After 4 sec: 3 is set to fire.
After 5 sec: 6 is set to fire.
After 6 sec: 9 is set to fire.
After 7 sec: 10 is set to fire.
It takes 7s to burn the complete tree.
Input:
1
/ \
2 3
/ \ \
4 5 7
/ /
8 10
Target Node = 10
Output: 5
Expected Time Complexity: O(number of nodes)
Expected Auxiliary Space: O(height of tree)
Constraints:
1 ≤ number of nodes ≤ 105
1 ≤ values of nodes ≤ 105
Approach 01:
-
C++
-
Python
#include <algorithm>
class Solution {
public:
// Helper function to calculate the maximum distance to target and update maxTime
int findMinTimeToTarget(Node* node, int& target, int& maxTime) {
if (node == nullptr)
return 0;
// Recursively find distances in the left and right subtrees
int leftDistance = findMinTimeToTarget(node->left, target, maxTime);
int rightDistance = findMinTimeToTarget(node->right, target, maxTime);
// If current node is the target, update maxTime with the longest distance found
if (node->data == target) {
maxTime = std::max(maxTime, std::max(leftDistance, rightDistance));
return -1;
} else {
// If both subtrees contain valid distances
if (leftDistance >= 0 && rightDistance >= 0)
return std::max(leftDistance, rightDistance) + 1;
// Ensure leftDistance is the smaller distance
if (leftDistance > rightDistance)
std::swap(leftDistance, rightDistance);
// Update maxTime with the difference between right and left distances
maxTime = std::max(maxTime, rightDistance - leftDistance);
return leftDistance - 1;
}
}
// Function to find the minimum time required to reach the target node
int minTime(Node* root, int target) {
int maxTime = 0;
findMinTimeToTarget(root, target, maxTime);
return maxTime;
}
};
class Solution:
def findMinTimeToTarget(self, node, target, maxTime):
if node is None:
return 0
# Recursively find distances in the left and right subtrees
leftDistance = self.findMinTimeToTarget(node.left, target, maxTime)
rightDistance = self.findMinTimeToTarget(node.right, target, maxTime)
# If current node is the target, update maxTime with the longest distance found
if node.data == target:
maxTime[0] = max(maxTime[0], max(leftDistance, rightDistance))
return -1
else:
# If both subtrees contain valid distances
if leftDistance >= 0 and rightDistance >= 0:
return max(leftDistance, rightDistance) + 1
# Ensure leftDistance is the smaller distance
if leftDistance > rightDistance:
leftDistance, rightDistance = rightDistance, leftDistance
# Update maxTime with the difference between right and left distances
maxTime[0] = max(maxTime[0], rightDistance - leftDistance)
return leftDistance - 1
def minTime(self, root, target):
maxTime = [0]
self.findMinTimeToTarget(root, target, maxTime)
return maxTime[0]
Time Complexity
- Recursive Function Calls:
The function
findMinTimeToTargetrecursively visits every node in the binary tree exactly once. Hence, the time complexity is proportional to the number of nodes in the tree. - Overall Time Complexity:
The overall time complexity is \( O(n) \), where \( n \) is the number of nodes in the binary tree.
Space Complexity
- Recursive Call Stack:
The space complexity due to the recursive call stack is \( O(h) \), where \( h \) is the height of the binary tree. In the worst case (a skewed tree), this can be \( O(n) \), but for a balanced binary tree, it is \( O(\log n) \).
- Additional Space:
Other than the recursion stack, the function uses a constant amount of space for variables such as
maxTime,leftDistance, andrightDistance, which is \( O(1) \). - Overall Space Complexity:
The overall space complexity is \( O(h) \), where \( h \) is the height of the binary tree, with \( O(n) \) being the worst case for a skewed tree and \( O(\log n) \) for a balanced tree.