Given a binary tree, a target node in the binary tree, and an integer value k, the task is to find all the nodes at a distance k from the given target node. No parent pointers are available.
Note:
You have to return the list in sorted order.
The tree will not contain duplicate values.
Examples:
Input: target = 2, k = 2
Output: 3 Explanation: Nodes at a distance 2 from the given target node 2 is 3.
Input: target = 3, k = 1
Output: 1 6 7 Explanation: Nodes at a distance 1 from the given target node 3 are 1 , 6 & 7.
[Expected Approach - 1] Using Recursion - O(nlogn) Time and O(h) Space
The idea is to traverse the binary tree using recursion and find the target node. Find all the nodes in the left and right subtree of target node that are at a distance k. Also for all the nodes in the path of target node, find all the nodes in the opposite subtree that are at the distance of (k - distance of target node).
Below is the implementation of the above approach:
C++
// C++ program to find nodes// at distance k from target.#include<bits/stdc++.h>usingnamespacestd;classNode{public:intdata;Node*left,*right;Node(intx){data=x;left=nullptr;right=nullptr;}};// Function which finds the nodes at a given// distance from root nodevoidfindNodes(Node*root,intdis,vector<int>&ans){// base caseif(root==nullptr)return;if(dis==0){ans.push_back(root->data);return;}findNodes(root->left,dis-1,ans);findNodes(root->right,dis-1,ans);}// Function which returns the distance of a node// target node. Returns -1 if target is not found.intkDistanceRecur(Node*root,inttarget,intk,vector<int>&ans){// base caseif(root==nullptr)return-1;// If current node is targetif(root->data==target){// Find nodes at distance k from// target node in subtree.findNodes(root,k,ans);return1;}intleft=kDistanceRecur(root->left,target,k,ans);// If target node is found in left// subtree, find all nodes at distance// k-left in right subtree.if(left!=-1){if(k-left==0)ans.push_back(root->data);elsefindNodes(root->right,k-left-1,ans);returnleft+1;}intright=kDistanceRecur(root->right,target,k,ans);// If target node is found in right// subtree, find all nodes at distance// k-right in left subtree.if(right!=-1){if(k-right==0)ans.push_back(root->data);elsefindNodes(root->left,k-right-1,ans);returnright+1;}// If target node is not found// return -1return-1;}vector<int>KDistanceNodes(Node*root,inttarget,intk){vector<int>ans;kDistanceRecur(root,target,k,ans);// sort the resultsort(ans.begin(),ans.end());returnans;}voidprintList(vector<int>v){intn=v.size();for(inti=0;i<n;i++){cout<<v[i]<<" ";}cout<<endl;}intmain(){// Create a hard coded tree.// 20// / \ // 7 24// / \ // 4 3// /// 1Node*root=newNode(20);root->left=newNode(7);root->right=newNode(24);root->left->left=newNode(4);root->left->right=newNode(3);root->left->right->left=newNode(1);inttarget=7,k=2;vector<int>ans=KDistanceNodes(root,target,k);printList(ans);return0;}
Java
// Java program to find nodes// at distance k from target.importjava.util.ArrayList;importjava.util.Collections;classNode{intdata;Nodeleft,right;Node(intx){data=x;left=null;right=null;}}classGfG{// Function which finds the nodes at a given// distance from root nodestaticvoidfindNodes(Noderoot,intdis,ArrayList<Integer>ans){// base caseif(root==null)return;if(dis==0){ans.add(root.data);return;}findNodes(root.left,dis-1,ans);findNodes(root.right,dis-1,ans);}// Function which returns the distance of a node// target node. Returns -1 if target is not found.staticintkDistanceRecur(Noderoot,inttarget,intk,ArrayList<Integer>ans){// base caseif(root==null)return-1;// If current node is targetif(root.data==target){// Find nodes at distance k from// target node in subtree.findNodes(root,k,ans);return1;}intleft=kDistanceRecur(root.left,target,k,ans);// If target node is found in left// subtree, find all nodes at distance// k-left in right subtree.if(left!=-1){if(k-left==0)ans.add(root.data);elsefindNodes(root.right,k-left-1,ans);returnleft+1;}intright=kDistanceRecur(root.right,target,k,ans);// If target node is found in right// subtree, find all nodes at distance// k-right in left subtree.if(right!=-1){if(k-right==0)ans.add(root.data);elsefindNodes(root.left,k-right-1,ans);returnright+1;}// If target node is not found// return -1return-1;}staticArrayList<Integer>KDistanceNodes(Noderoot,inttarget,intk){ArrayList<Integer>ans=newArrayList<>();kDistanceRecur(root,target,k,ans);// sort the resultCollections.sort(ans);returnans;}staticvoidprintList(ArrayList<Integer>v){for(inti:v){System.out.print(i+" ");}System.out.println();}publicstaticvoidmain(String[]args){// Create a hard coded tree.// 20// / \// 7 24// / \// 4 3// /// 1Noderoot=newNode(20);root.left=newNode(7);root.right=newNode(24);root.left.left=newNode(4);root.left.right=newNode(3);root.left.right.left=newNode(1);inttarget=7,k=2;ArrayList<Integer>ans=KDistanceNodes(root,target,k);printList(ans);}}
Python
# Python program to find nodes# at distance k from target.classNode:def__init__(self,x):self.data=xself.left=Noneself.right=None# Function which finds the nodes at a given# distance from root nodedeffindNodes(root,dis,ans):# base caseifrootisNone:returnifdis==0:ans.append(root.data)returnfindNodes(root.left,dis-1,ans)findNodes(root.right,dis-1,ans)# Function which returns the distance of a node# target node. Returns -1 if target is not found.defkDistanceRecur(root,target,k,ans):# base caseifrootisNone:return-1# If current node is targetifroot.data==target:# Find nodes at distance k from# target node in subtree.findNodes(root,k,ans)return1left=kDistanceRecur(root.left,target,k,ans)# If target node is found in left# subtree, find all nodes at distance# k-left in right subtree.ifleft!=-1:ifk-left==0:ans.append(root.data)else:findNodes(root.right,k-left-1,ans)returnleft+1right=kDistanceRecur(root.right,target,k,ans)# If target node is found in right# subtree, find all nodes at distance# k-right in left subtree.ifright!=-1:ifk-right==0:ans.append(root.data)else:findNodes(root.left,k-right-1,ans)returnright+1# If target node is not found# return -1return-1defKDistanceNodes(root,target,k):ans=[]kDistanceRecur(root,target,k,ans)# sort the resultans.sort()returnansdefprintList(v):print(" ".join(map(str,v)))if__name__=="__main__":# Create a hard coded tree.# 20# / \# 7 24# / \# 4 3# /# 1root=Node(20)root.left=Node(7)root.right=Node(24)root.left.left=Node(4)root.left.right=Node(3)root.left.right.left=Node(1)target=7k=2ans=KDistanceNodes(root,target,k)printList(ans)
C#
// C# program to find nodes// at distance k from target.usingSystem;usingSystem.Collections.Generic;classNode{publicintdata;publicNodeleft,right;publicNode(intx){data=x;left=null;right=null;}}classGfG{// Function which finds the nodes at a given// distance from root nodestaticvoidfindNodes(Noderoot,intdis,List<int>ans){// base caseif(root==null)return;if(dis==0){ans.Add(root.data);return;}findNodes(root.left,dis-1,ans);findNodes(root.right,dis-1,ans);}// Function which returns the distance of a node// target node. Returns -1 if target is not found.staticintkDistanceRecur(Noderoot,inttarget,intk,List<int>ans){// base caseif(root==null)return-1;// If current node is targetif(root.data==target){// Find nodes at distance k from// target node in subtree.findNodes(root,k,ans);return1;}intleft=kDistanceRecur(root.left,target,k,ans);// If target node is found in left// subtree, find all nodes at distance// k-left in right subtree.if(left!=-1){if(k-left==0)ans.Add(root.data);elsefindNodes(root.right,k-left-1,ans);returnleft+1;}intright=kDistanceRecur(root.right,target,k,ans);// If target node is found in right// subtree, find all nodes at distance// k-right in left subtree.if(right!=-1){if(k-right==0)ans.Add(root.data);elsefindNodes(root.left,k-right-1,ans);returnright+1;}// If target node is not found// return -1return-1;}staticList<int>KDistanceNodes(Noderoot,inttarget,intk){List<int>ans=newList<int>();kDistanceRecur(root,target,k,ans);// sort the resultans.Sort();returnans;}staticvoidprintList(List<int>v){foreach(intiinv){Console.Write(i+" ");}Console.WriteLine();}staticvoidMain(){// Create a hard coded tree.// 20// / \// 7 24// / \// 4 3// /// 1Noderoot=newNode(20);root.left=newNode(7);root.right=newNode(24);root.left.left=newNode(4);root.left.right=newNode(3);root.left.right.left=newNode(1);inttarget=7,k=2;List<int>ans=KDistanceNodes(root,target,k);printList(ans);}}
JavaScript
// JavaScript program to find nodes// at distance k from target.classNode{constructor(x){this.key=x;this.left=null;this.right=null;}}// Function which finds the nodes at a given// distance from root nodefunctionfindNodes(root,dis,ans){// base caseif(root===null)return;if(dis===0){ans.push(root.key);return;}findNodes(root.left,dis-1,ans);findNodes(root.right,dis-1,ans);}// Function which returns the distance of a node// target node. Returns -1 if target is not found.functionkDistanceRecur(root,target,k,ans){// base caseif(root===null)return-1;// If current node is targetif(root.key===target){// Find nodes at distance k from// target node in subtree.findNodes(root,k,ans);return1;}letleft=kDistanceRecur(root.left,target,k,ans);// If target node is found in left// subtree, find all nodes at distance// k-left in right subtree.if(left!==-1){if(k-left===0)ans.push(root.key);elsefindNodes(root.right,k-left-1,ans);returnleft+1;}letright=kDistanceRecur(root.right,target,k,ans);// If target node is found in right// subtree, find all nodes at distance// k-right in left subtree.if(right!==-1){if(k-right===0)ans.push(root.key);elsefindNodes(root.left,k-right-1,ans);returnright+1;}// If target node is not found// return -1return-1;}functionKDistanceNodes(root,target,k){letans=[];kDistanceRecur(root,target,k,ans);// sort the resultans.sort((a,b)=>a-b);returnans;}functionprintList(v){console.log(v.join(" "));}// Create a hard coded tree.// 20// / \// 7 24// / \// 4 3// /// 1letroot=newNode(20);root.left=newNode(7);root.right=newNode(24);root.left.left=newNode(4);root.left.right=newNode(3);root.left.right.left=newNode(1);lettarget=7,k=2;letans=KDistanceNodes(root,target,k);printList(ans);
Output
1 24
Time Complexity: O(nlogn), for sorting the result. Auxiliary Space: O(h), where h is the height of the tree.
[Expected Approach - 2] Using DFS with Parent Pointers - O(nlogn) Time and O(n) Space:
The idea is to recursively find the target node and map each node to its parent node. Then, starting from the target node, apply depth first search (DFS) to find all the nodes at distance k from the target node.
Below is the implementation of the above approach:
C++
// C++ program to find nodes// at distance k from target.#include<bits/stdc++.h>usingnamespacestd;classNode{public:intdata;Node*left,*right;Node(intx){data=x;left=nullptr;right=nullptr;}};// Function which maps the nodes to its parent nodes// and returns the target node.Node*findTarNode(Node*root,inttarget,unordered_map<Node*,Node*>&parent){Node*left=nullptr,*right=nullptr;// map the left child to root node // and search for target node in // left subtree.if(root->left!=nullptr){parent[root->left]=root;left=findTarNode(root->left,target,parent);}// map the right child to root node and search // for target node in right subtree.if(root->right!=nullptr){parent[root->right]=root;right=findTarNode(root->right,target,parent);}// If root node is target, then// return root node.if(root->data==target){returnroot;}// If target node in found in left// subtree, then return left.elseif(left!=nullptr){returnleft;}// return the result from// right subtree.returnright;}// depth first function to find nodes k // distance away.voiddfs(Node*root,Node*prev,intk,unordered_map<Node*,Node*>&parent,vector<int>&ans){// base caseif(root==nullptr)return;// If current node is kth // distance away.if(k==0){ans.push_back(root->data);return;}if(root->left!=prev)dfs(root->left,root,k-1,parent,ans);if(root->right!=prev)dfs(root->right,root,k-1,parent,ans);if(parent[root]!=prev)dfs(parent[root],root,k-1,parent,ans);}vector<int>KDistanceNodes(Node*root,inttarget,intk){vector<int>ans;if(root==nullptr)returnans;// find the target nodes and map the nodes// to their parent nodes.unordered_map<Node*,Node*>parent;Node*tar=findTarNode(root,target,parent);dfs(tar,nullptr,k,parent,ans);// sort the resultsort(ans.begin(),ans.end());returnans;}voidprintList(vector<int>v){intn=v.size();for(inti=0;i<n;i++){cout<<v[i]<<" ";}cout<<endl;}intmain(){// Create a hard coded tree.// 20// / \ // 7 24// / \ // 4 3// /// 1Node*root=newNode(20);root->left=newNode(7);root->right=newNode(24);root->left->left=newNode(4);root->left->right=newNode(3);root->left->right->left=newNode(1);inttarget=7,k=2;vector<int>ans=KDistanceNodes(root,target,k);printList(ans);return0;}
Java
// Java program to find nodes// at distance k from target.importjava.util.*;classNode{intdata;Nodeleft,right;Node(intx){data=x;left=null;right=null;}}classGfG{// Function which maps the nodes to its parent nodes// and returns the target node.staticNodefindTarNode(Noderoot,inttarget,Map<Node,Node>parent){Nodeleft=null,right=null;// map the left child to root node // and search for target node in // left subtree.if(root.left!=null){parent.put(root.left,root);left=findTarNode(root.left,target,parent);}// map the right child to root node and search // for target node in right subtree.if(root.right!=null){parent.put(root.right,root);right=findTarNode(root.right,target,parent);}// If root node is target, then// return root node.if(root.data==target){returnroot;}// If target node in found in left// subtree, then return left.elseif(left!=null){returnleft;}// return the result from// right subtree.returnright;}// depth first function to find nodes k // distance away.staticvoiddfs(Noderoot,Nodeprev,intk,Map<Node,Node>parent,ArrayList<Integer>ans){// base caseif(root==null)return;// If current node is kth // distance away.if(k==0){ans.add(root.data);return;}if(root.left!=prev)dfs(root.left,root,k-1,parent,ans);if(root.right!=prev)dfs(root.right,root,k-1,parent,ans);if(parent.get(root)!=prev)dfs(parent.get(root),root,k-1,parent,ans);}staticArrayList<Integer>KDistanceNodes(Noderoot,inttarget,intk){ArrayList<Integer>ans=newArrayList<>();if(root==null)returnans;// find the target nodes and map the nodes// to their parent nodes.Map<Node,Node>parent=newHashMap<>();Nodetar=findTarNode(root,target,parent);dfs(tar,null,k,parent,ans);// sort the resultCollections.sort(ans);returnans;}staticvoidprintList(ArrayList<Integer>v){for(inti:v){System.out.print(i+" ");}System.out.println();}publicstaticvoidmain(String[]args){// Create a hard coded tree.// 20// / \// 7 24// / \// 4 3// /// 1Noderoot=newNode(20);root.left=newNode(7);root.right=newNode(24);root.left.left=newNode(4);root.left.right=newNode(3);root.left.right.left=newNode(1);inttarget=7,k=2;ArrayList<Integer>ans=KDistanceNodes(root,target,k);printList(ans);}}
Python
# Python program to find nodes# at distance k from target.classNode:def__init__(self,x):self.data=xself.left=Noneself.right=None# Function which maps the nodes to its parent nodes# and returns the target node.deffindTarNode(root,target,parent):left=right=None# map the left child to root node # and search for target node in # left subtree.ifroot.leftisnotNone:parent[root.left]=rootleft=findTarNode(root.left,target,parent)# map the right child to root node and search # for target node in right subtree.ifroot.rightisnotNone:parent[root.right]=rootright=findTarNode(root.right,target,parent)# If root node is target, then# return root node.ifroot.data==target:returnroot# If target node in found in left# subtree, then return left.elifleft:returnleft# return the result from# right subtree.returnright# depth first function to find nodes k # distance away.defdfs(root,prev,k,parent,ans):# base caseifnotroot:return# If current node is kth # distance away.ifk==0:ans.append(root.data)returnifroot.left!=prev:dfs(root.left,root,k-1,parent,ans)ifroot.right!=prev:dfs(root.right,root,k-1,parent,ans)ifparent.get(root)!=prev:dfs(parent[root],root,k-1,parent,ans)defKDistanceNodes(root,target,k):ans=[]ifnotroot:returnans# find the target nodes and map the nodes# to their parent nodes.parent={}parent[root]=Nonetar=findTarNode(root,target,parent)dfs(tar,None,k,parent,ans)# sort the resultans.sort()returnansdefprintList(v):print(" ".join(map(str,v)))if__name__=="__main__":# Create a hard coded tree.# 20# / \# 7 24# / \# 4 3# /# 1root=Node(20)root.left=Node(7)root.right=Node(24)root.left.left=Node(4)root.left.right=Node(3)root.left.right.left=Node(1)target=7k=2ans=KDistanceNodes(root,target,k)printList(ans)
C#
// C# program to find nodes// at distance k from target.usingSystem;usingSystem.Collections.Generic;classNode{publicintdata;publicNodeleft,right;publicNode(intx){data=x;left=null;right=null;}}classGfG{// Function which maps the nodes to its parent nodes// and returns the target node.staticNodefindTarNode(Noderoot,inttarget,Dictionary<Node,Node>parent){Nodeleft=null,right=null;// map the left child to root node // and search for target node in // left subtree.if(root.left!=null){parent[root.left]=root;left=findTarNode(root.left,target,parent);}// map the right child to root node and search // for target node in right subtree.if(root.right!=null){parent[root.right]=root;right=findTarNode(root.right,target,parent);}// If root node is target, then// return root node.if(root.data==target){returnroot;}// If target node in found in left// subtree, then return left.elseif(left!=null){returnleft;}// return the result from// right subtree.returnright;}staticvoiddfs(Noderoot,Nodeprev,intk,Dictionary<Node,Node>parent,List<int>ans){// base caseif(root==null)return;// If current node is kth // distance away.if(k==0){ans.Add(root.data);return;}if(root.left!=prev)dfs(root.left,root,k-1,parent,ans);if(root.right!=prev)dfs(root.right,root,k-1,parent,ans);if(parent[root]!=prev)dfs(parent[root],root,k-1,parent,ans);}staticList<int>KDistanceNodes(Noderoot,inttarget,intk){List<int>ans=newList<int>();if(root==null)returnans;Dictionary<Node,Node>parent=newDictionary<Node,Node>();parent[root]=null;Nodetar=findTarNode(root,target,parent);dfs(tar,null,k,parent,ans);// sort the resultans.Sort();returnans;}staticvoidprintList(List<int>v){foreach(intiinv){Console.Write(i+" ");}Console.WriteLine();}staticvoidMain(string[]args){// Create a hard coded tree.// 20// / \// 7 24// / \// 4 3// /// 1Noderoot=newNode(20);root.left=newNode(7);root.right=newNode(24);root.left.left=newNode(4);root.left.right=newNode(3);root.left.right.left=newNode(1);inttarget=7,k=2;List<int>ans=KDistanceNodes(root,target,k);printList(ans);}}
JavaScript
// JavaScript program to find nodes// at distance k from target.classNode{constructor(x){this.key=x;this.left=null;this.right=null;}}// Function which maps the nodes to its parent nodes// and returns the target node.functionfindTarNode(root,target,parent){letleft=null,right=null;// map the left child to root node // and search for target node in // left subtree.if(root.left!==null){parent.set(root.left,root);left=findTarNode(root.left,target,parent);}// map the right child to root node and search // for target node in right subtree.if(root.right!==null){parent.set(root.right,root);right=findTarNode(root.right,target,parent);}// If root node is target, then// return root node.if(root.key===target){returnroot;}// If target node in found in left// subtree, then return left.elseif(left!==null){returnleft;}// return the result from// right subtree.returnright;}// depth first function to find nodes k // distance away.functiondfs(root,prev,k,parent,ans){// base caseif(root===null)return;// If current node is kth // distance away.if(k===0){ans.push(root.key);return;}if(root.left!==prev)dfs(root.left,root,k-1,parent,ans);if(root.right!==prev)dfs(root.right,root,k-1,parent,ans);if(parent.get(root)!==prev)dfs(parent.get(root),root,k-1,parent,ans);}functionKDistanceNodes(root,target,k){letans=[];if(root===null)returnans;// find the target nodes and map the nodes// to their parent nodes.letparent=newMap();parent.set(root,null);lettar=findTarNode(root,target,parent);dfs(tar,null,k,parent,ans);// sort the resultans.sort((a,b)=>a-b);returnans;}functionprintList(v){console.log(v.join(" "));}// Create a hard coded tree.// 20// / \// 7 24// / \// 4 3// /// 1letroot=newNode(20);root.left=newNode(7);root.right=newNode(24);root.left.left=newNode(4);root.left.right=newNode(3);root.left.right.left=newNode(1);lettarget=7,k=2;letans=KDistanceNodes(root,target,k);printList(ans);
Output
1 24
Time Complexity: O(nlogn), for sorting the result. Space Complexity: O(h), where h is the height of the tree.