- Given a binary tree, print nodes at k distance from leaf nodes using recursion.
- K should have value <= height of a binary tree.
- Perform preOrder traversal in a binary tree using depth first search recursive (DFS) algorithm.
- The logical flow of current problem is quite similar to Print paths from root to leaf nodes in binary tree .
Algorithm: print nodes at k distance from leaf nodes using java
- Print a nodes at distance K = 2 from leaf nodes.
- Perform pre order traversal
- Add current node to array and mark current node un-visited [Node A]
- If current node is not a leaf node
- Traverse the left sub tree [Node B]
- Add Node B to array and mark it un-visited
- Traverse the left sub tree [Node D]
- Add Node D to array and mark it un-visited
- Node D is leaf node and its not visited earlier.
- Print Node at K distance from array
- Print Node A (100) & mark Node A as visited.
- Node D is leaf node and its not visited earlier.
- Traverse the right sub tree [Node E]
- Add Node E to array and mark it un-visited
- Node E is leaf node and its not visited earlier.
- Already visited node at K = 2 [Node A]
- Node A would not be printed
- Add Node D to array and mark it un-visited
- Traverse the right sub tree [Node C]
- Add Node C to array and mark it un-visited
- Follow the algorithm same (left sub-tree) & Node C will be printed
- Traverse the left sub tree [Node B]
- Similarly, print nodes in all sub-trees. (ref Fig 2)
We have summarized nodes at K distance from leaf nodes as follows:
K(Distance) | Output |
---|---|
1 | B,F,G |
2 | A,C |
3 | A |
- Save the node data in array
- Mark the current node as unvisited node (false)
- Traverse the binary tree till, we encounter the leaf node
- If we have not visited the node earlier, let us print it and mark it visited
- Follow the same procedure for all nodes
Program: print nodes K distance from leaf node in binary tree (java)
1.) PrintNodesKDistFromLeaf Class:
- Traverse the binary tree using depth first search recursive algorithm.
- Print the nodes at K distance from a leaf nodes in a binary tree.
package org.learn.Question; import org.learn.PrepareTree.Node; public class PrintNodesKDistFromLeaf { private static void printNodes(Node root, int distance,int index, int[] data, boolean[] isVisitedBefore) { if(null == root) { return; } data[index] = root.data; isVisitedBefore[index] = false; if(root.left == null && root.right == null && index - distance >= 0 && isVisitedBefore[index-distance] == false) { System.out.printf(" %d ",data[index-distance ]); isVisitedBefore[index-distance] = true; } else if(distance > 0) { index++; printNodes(root.left, distance,index, data, isVisitedBefore); printNodes(root.right, distance,index, data, isVisitedBefore); } return; } public static void printNodesKDistFromLeaf(Node root, int distance) { int data[]= new int[1024]; boolean visit[]= new boolean[1024]; printNodes(root, distance, 0, data, visit); } }
2.) Node Class:
- Node class represents the nodes of a binary tree.
package org.learn.PrepareTree; public class Node { public int data; public Node left; public Node right; public Node(int num) { this.data = num; this.left = null; this.right = null; } public Node() { this.left = null; this.right = null; } public static Node createNode(int number) { return new Node(number); } }
3.) App Class:
- We are creating the binary tree in main method.
- We are calling PrintNodesKDistFromLeaf class, to print nodes at K distance from a leaf nodes.
- We are traversing the binary tree using depth first search algorithm.
package org.learn.Client; import org.learn.PrepareTree.Node; import org.learn.Question.PrintNodesKDistFromLeaf; public class App { public static void main( String[] args ) { //root level 0 Node A = Node.createNode(100); //Level 1 Node B = Node.createNode(50); Node C = Node.createNode(150); //Level 2 Node D = Node.createNode(25); Node E = Node.createNode(75); Node F = Node.createNode(125); Node G = Node.createNode(175); //Level 3 Node H = Node.createNode(120); Node I = Node.createNode(140); Node J = Node.createNode(160); Node K = Node.createNode(190); //connect Level 0 and 1 A.left = B; A.right = C; //connect level 1 and level 2 B.left = D; B.right = E; C.left = F; C.right = G; //Connect level 2 and level 3 F.left = H; F.right = I; G.left = J; G.right = K; int distance = 1; System.out.printf("Nodes at distance %d from Leaf Node \n",distance); PrintNodesKDistFromLeaf.printNodesKDistFromLeaf(A,distance); distance = 2; System.out.printf("\nNodes at distance %d from Leaf Node\n",distance); PrintNodesKDistFromLeaf.printNodesKDistFromLeaf(A,distance); distance = 3; System.out.printf("\nNodes at distance %d from Leaf Node\n",distance); PrintNodesKDistFromLeaf.printNodesKDistFromLeaf(A,distance); } }
Output: print nodes K distance from leaf node in binary tree (java)
Nodes at distance 1 from Leaf Node 50 125 175 Nodes at distance 2 from Leaf Node 100 150 Nodes at distance 3 from Leaf Node 100
Download code – print nodes K Distance from leaf (DFS)