Closest leaf to a given node in Binary Tree - GeeksforGeeks
Given a Binary Tree and a node x in it, find distance of the closest leaf to x in Binary Tree. If given node itself is a leaf, then distance is 0.
Related
http://massivealgorithms.blogspot.com/2016/11/binary-tree-all-paths-max-sum-path.html
Read full article from Closest leaf to a given node in Binary Tree - GeeksforGeeks
Given a Binary Tree and a node x in it, find distance of the closest leaf to x in Binary Tree. If given node itself is a leaf, then distance is 0.
Input: Root of below tree
And x = pointer to node 13
10
/ \
12 13
/ \
14 15
/ \ / \
21 22 23 24
/\ /\ /\ /\
1 2 3 4 5 6 7 8
Output 2
Closest leaf is 12 through 10.
The idea is to first traverse the subtree rooted with give node and find the closest leaf in this subtree. Store this distance. Now traverse tree starting from root. If given node x is in left subtree of root, then find the closest leaf in right subtree, else find the closest left in left subtree.
Time Complexity of this above solution is O(n) as it does at most two traversals of given Binary Tree.
class Distance { int minDis = Integer.MAX_VALUE;} // This function finds closest leaf to root. This distance // is stored at *minDist. void findLeafDown(Node root, int lev, Distance minDist) { // base case if (root == null) return; // If this is a leaf node, then check if it is closer // than the closest so far if (root.left == null && root.right == null) { if (lev < (minDist.minDis)) minDist.minDis = lev; return; } // Recur for left and right subtrees findLeafDown(root.left, lev + 1, minDist); findLeafDown(root.right, lev + 1, minDist); } // This function finds if there is closer leaf to x through // parent node. int findThroughParent(Node root, Node x, Distance minDist) { // Base cases if (root == null) return -1; if (root == x) return 0; // Search x in left subtree of root int l = findThroughParent(root.left, x, minDist); // If left subtree has x if (l != -1) { // Find closest leaf in right subtree findLeafDown(root.right, l + 2, minDist); return l + 1; } // Search x in right subtree of root int r = findThroughParent(root.right, x, minDist); // If right subtree has x if (r != -1) { // Find closest leaf in left subtree findLeafDown(root.left, r + 2, minDist); return r + 1; } return -1; } // Returns minimum distance of a leaf from given node x int minimumDistance(Node root, Node x) { // Initialize result (minimum distance from a leaf) Distance d = new Distance(); // Find closest leaf down to x findLeafDown(x, 0, d); // See if there is a closer leaf through parent findThroughParent(root, x, d); return d.minDis; }Related
http://massivealgorithms.blogspot.com/2016/11/binary-tree-all-paths-max-sum-path.html
Read full article from Closest leaf to a given node in Binary Tree - GeeksforGeeks