Burning Tree || Gfg Problem of the day
class Solution {
static HashMap<Integer, Integer> map;
public static int findNumberOfNodesInTree(Node root){ // Inorder traversal (iterative method)
map = new HashMap<>();
Stack<Node> stack = new Stack<>();
Node ptr = root;
int ans = 0;
while (true) {
if (ptr != null) {
stack.push(ptr);
ptr = ptr.left;
} else {
if (stack.isEmpty()) break;
Node delNode = stack.pop();
map.put(delNode.data, ans);
ans++;
ptr = delNode.right;
}
}
return ans;
}
//Recusive function // its t.c. -> O(n) -> total number of nodes
public static void fillDepthArr(Node root, int[] depthArr, HashSet<Integer> set) {
if (root.left != null) {
fillDepthArr(root.left, depthArr, set);
if (!set.contains(map.get(root.left.data)))
depthArr[map.get(root.data)] = Math.max(depthArr[map.get(root.data)], depthArr[map.get(root.left.data)] + 1);
}
if (root.right != null) {
fillDepthArr(root.right, depthArr, set);
if (!set.contains(map.get(root.right.data)))
depthArr[map.get(root.data)] = Math.max(depthArr[map.get(root.data)], depthArr[map.get(root.right.data)] + 1);
}
}
public static int minTime(Node root, int target) {
// Your code goes here
ArrayList<ArrayList<Integer>> adj = new ArrayList<>();
int numberOfNodes = findNumberOfNodesInTree(root);
int[] parArr = new int[numberOfNodes];
Arrays.fill(parArr, -1);
//adj list building
for (int i = 0; i < numberOfNodes; i++) adj.add(new ArrayList<>());
Queue<Node> queue = new LinkedList<>();
queue.offer(root); // level order traversal
while (!queue.isEmpty()) {
int sizeOfQueue = queue.size();
while (sizeOfQueue-- > 0) {
Node delNode = queue.poll();
if (delNode.left != null) {
adj.get(map.get(delNode.data)).add(map.get(delNode.left.data));
parArr[map.get(delNode.left.data)] = map.get(delNode.data);
queue.offer(delNode.left);
}
if (delNode.right != null) {
adj.get(map.get(delNode.data)).add(map.get(delNode.right.data));
parArr[map.get(delNode.right.data)] = map.get(delNode.data);
queue.offer(delNode.right);
}
}
}
// map for storing value -> idx
// Calculating target to root path
ArrayList<Integer> targetToRootPath = new ArrayList<>();
int ptr = map.get(target);
while (ptr != -1) {
targetToRootPath.add(ptr);
ptr = parArr[ptr];
}
Collections.reverse(targetToRootPath); // target (5), root(3), targetToRootPth is (5 -> 2 -> 1 -> 3), (3 -> 1 -> 2 -> 5)
// 1 -> 2 -> 5 -> 8
// I am at node 1, now , depth 1 is 4, ans = 7
// I am at node 2, now , depth 2 is 1, ans = max(3, 7) -> 7
// I am at node 5, now , depth 5 is 1, ans = max(2, 7) -> 7
// I am at node 8, now , depth 8 is 0, ans = max(0, 7) -> 7
// storing path nodes in my set
HashSet<Integer> targetToRootPathNodesSet = new HashSet<>();
for (int idx : targetToRootPath) targetToRootPathNodesSet.add(idx);
int[] depthArr = new int[numberOfNodes];
fillDepthArr(root, depthArr, targetToRootPathNodesSet);
int ans = 0;
int targetToRootPathSize = targetToRootPath.size();
for (int i = 0; i < targetToRootPathSize; i++) {
ans = Math.max(ans, targetToRootPathSize - i - 1 + depthArr[targetToRootPath.get(i)]);
}
return ans;
}
}
class Pair {
Node node;
int depth;
Pair() {}
Pair(Node n, int d) {
node = n;
depth = d;
}
}
Comments
Post a Comment