- 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)
