Given a binary tree in which nodes are numbered from 1 to n. Given a node and a positive integer K. We have to print the K-th ancestor of the given node in the binary tree. If there does not exist any such ancestor then print -1.
For example in the below given binary tree, 2nd ancestor of node 4 and 5 is 1. 3rd ancestor of node 4 will be -1.
The idea to do this is to first traverse the binary tree and store the ancestor of each node in an array of size n. For example, suppose the array is ancestor[n]. Then at index i, ancestor[i] will store the ancestor of ith node. So, the 2nd ancestor of ith node will be ancestor[ancestor[i]] and so on. We will use this idea to calculate the kth ancestor of the given node. We can use level order traversal to populate this array of ancestors.
Below is the implementation of above idea.
/* C++ program to calculate Kth ancestor of given node */ #include <iostream> #include <queue> using namespace std;
// A Binary Tree Node struct Node
{ int data;
struct Node *left, *right;
}; // function to generate array of ancestors void generateArray(Node *root, int ancestors[])
{ // There will be no ancestor of root node
ancestors[root->data] = -1;
// level order traversal to
// generate 1st ancestor
queue<Node*> q;
q.push(root);
while (!q.empty())
{
Node* temp = q.front();
q.pop();
if (temp->left)
{
ancestors[temp->left->data] = temp->data;
q.push(temp->left);
}
if (temp->right)
{
ancestors[temp->right->data] = temp->data;
q.push(temp->right);
}
}
} // function to calculate Kth ancestor int kthAncestor(Node *root, int n, int k, int node)
{ // create array to store 1st ancestors
int ancestors[n+1] = {0};
// generate first ancestor array
generateArray(root,ancestors);
// variable to track record of number of
// ancestors visited
int count = 0;
while (node!=-1)
{
node = ancestors[node];
count++;
if (count==k)
break ;
}
// print Kth ancestor
return node;
} // Utility function to create a new tree node Node* newNode( int data)
{ Node *temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
} // Driver program to test above functions int main()
{ // Let us create binary tree shown in above diagram
Node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
int k = 2;
int node = 5;
// print kth ancestor of given node
cout<<kthAncestor(root,5,k,node);
return 0;
} |
/* Java program to calculate Kth ancestor of given node */ import java.util.*;
class GfG {
// A Binary Tree Node static class Node
{ int data;
Node left, right;
} // function to generate array of ancestors static void generateArray(Node root, int ancestors[])
{ // There will be no ancestor of root node
ancestors[root.data] = - 1 ;
// level order traversal to
// generate 1st ancestor
Queue<Node> q = new LinkedList<Node> ();
q.add(root);
while (!q.isEmpty())
{
Node temp = q.peek();
q.remove();
if (temp.left != null )
{
ancestors[temp.left.data] = temp.data;
q.add(temp.left);
}
if (temp.right != null )
{
ancestors[temp.right.data] = temp.data;
q.add(temp.right);
}
}
} // function to calculate Kth ancestor static int kthAncestor(Node root, int n, int k, int node)
{ // create array to store 1st ancestors
int ancestors[] = new int [n + 1 ];
// generate first ancestor array
generateArray(root,ancestors);
// variable to track record of number of
// ancestors visited
int count = 0 ;
while (node!=- 1 )
{
node = ancestors[node];
count++;
if (count==k)
break ;
}
// print Kth ancestor
return node;
} // Utility function to create a new tree node static Node newNode( int data)
{ Node temp = new Node();
temp.data = data;
temp.left = null ;
temp.right = null ;
return temp;
} // Driver program to test above functions public static void main(String[] args)
{ // Let us create binary tree shown in above diagram
Node root = newNode( 1 );
root.left = newNode( 2 );
root.right = newNode( 3 );
root.left.left = newNode( 4 );
root.left.right = newNode( 5 );
int k = 2 ;
int node = 5 ;
// print kth ancestor of given node
System.out.println(kthAncestor(root, 5 ,k,node));
} } |
"""Python3 program to calculate Kth ancestor of given node """
# A Binary Tree Node # Utility function to create a new tree node class newNode:
# Constructor to create a newNode
def __init__( self , data):
self .data = data
self .left = None
self .right = None
# function to generate array of ancestors def generateArray(root, ancestors):
# There will be no ancestor of root node
ancestors[root.data] = - 1
# level order traversal to
# generate 1st ancestor
q = []
q.append(root)
while ( len (q)):
temp = q[ 0 ]
q.pop( 0 )
if (temp.left):
ancestors[temp.left.data] = temp.data
q.append(temp.left)
if (temp.right):
ancestors[temp.right.data] = temp.data
q.append(temp.right)
# function to calculate Kth ancestor def kthAncestor(root, n, k, node):
# create array to store 1st ancestors
ancestors = [ 0 ] * (n + 1 )
# generate first ancestor array
generateArray(root,ancestors)
# variable to track record of number
# of ancestors visited
count = 0
while (node ! = - 1 ) :
node = ancestors[node]
count + = 1
if (count = = k):
break
# print Kth ancestor
return node
# Driver Code if __name__ = = '__main__' :
# Let us create binary tree shown
# in above diagram
root = newNode( 1 )
root.left = newNode( 2 )
root.right = newNode( 3 )
root.left.left = newNode( 4 )
root.left.right = newNode( 5 )
k = 2
node = 5
# print kth ancestor of given node
print (kthAncestor(root, 5 , k, node))
# This code is contributed by # SHUBHAMSINGH10 |
/* C# program to calculate Kth ancestor of given node */ using System;
using System.Collections.Generic;
class GfG
{ // A Binary Tree Node public class Node
{ public int data;
public Node left, right;
} // function to generate array of ancestors static void generateArray(Node root, int []ancestors)
{ // There will be no ancestor of root node
ancestors[root.data] = -1;
// level order traversal to
// generate 1st ancestor
LinkedList<Node> q = new LinkedList<Node> ();
q.AddLast(root);
while (q.Count != 0)
{
Node temp = q.First.Value;
q.RemoveFirst();
if (temp.left != null )
{
ancestors[temp.left.data] = temp.data;
q.AddLast(temp.left);
}
if (temp.right != null )
{
ancestors[temp.right.data] = temp.data;
q.AddLast(temp.right);
}
}
} // function to calculate Kth ancestor static int kthAncestor(Node root, int n, int k, int node)
{ // create array to store 1st ancestors
int []ancestors = new int [n + 1];
// generate first ancestor array
generateArray(root,ancestors);
// variable to track record of number of
// ancestors visited
int count = 0;
while (node != -1)
{
node = ancestors[node];
count++;
if (count == k)
break ;
}
// print Kth ancestor
return node;
} // Utility function to create a new tree node static Node newNode( int data)
{ Node temp = new Node();
temp.data = data;
temp.left = null ;
temp.right = null ;
return temp;
} // Driver program to test above functions public static void Main(String[] args)
{ // Let us create binary tree shown in above diagram
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
int k = 2;
int node = 5;
// print kth ancestor of given node
Console.WriteLine(kthAncestor(root,5,k,node));
} } // This code has been contributed by 29AjayKumar |
<script> /* JavaScript program to calculate Kth ancestor of given node */ // A Binary Tree Node class Node { constructor()
{
this .data = 0;
this .left = null ;
this .right = null ;
}
} // function to generate array of ancestors function generateArray(root, ancestors)
{ // There will be no ancestor of root node
ancestors[root.data] = -1;
// level order traversal to
// generate 1st ancestor
var q = [];
q.push(root);
while (q.length != 0)
{
var temp = q[0];
q.shift();
if (temp.left != null )
{
ancestors[temp.left.data] = temp.data;
q.push(temp.left);
}
if (temp.right != null )
{
ancestors[temp.right.data] = temp.data;
q.push(temp.right);
}
}
} // function to calculate Kth ancestor function kthAncestor(root, n, k, node)
{ // create array to store 1st ancestors
var ancestors = Array(n+1).fill(0);
// generate first ancestor array
generateArray(root,ancestors);
// variable to track record of number of
// ancestors visited
var count = 0;
while (node != -1)
{
node = ancestors[node];
count++;
if (count == k)
break ;
}
// print Kth ancestor
return node;
} // Utility function to create a new tree node function newNode(data)
{ var temp = new Node();
temp.data = data;
temp.left = null ;
temp.right = null ;
return temp;
} // Driver program to test above functions // Let us create binary tree shown in above diagram var root = newNode(1);
root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); var k = 2;
var node = 5;
// print kth ancestor of given node document.write(kthAncestor(root,5,k,node)); </script> |
1
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 2: In this method first we will get an element whose ancestor has to be searched and from that node, we will decrement count one by one till we reach that ancestor node.
for example –
consider the tree given below:- (1) / \ (4) (2) / \ \ (3) (7) (6) \ (8) Then check if k=0 if yes then return that element as an ancestor else climb a level up and reduce k (k = k-1). Initially k = 2 First we search for 8 then, at 8 => check if(k == 0) but k = 2 so k = k-1 => k = 2-1 = 1 and climb a level up i.e. at 7 at 7 => check if(k == 0) but k = 1 so k = k-1 => k = 1-1 = 0 and climb a level up i.e. at 4 at 4 => check if(k == 0) yes k = 0 return this node as ancestor.
Implementation:
< div id= "highlighter_73341" class = "syntaxhighlighter nogutter " ><table border= "0" cellpadding= "0" cellspacing= "0" ><tbody><tr><td class = "code" >< div class = "container" >< div class = "line number1 index0 alt2" ><code class = "comments" > // C++ program for finding </code></div><div class="line number2 index1 alt1"><code class="comments">// kth ancestor of a particular node </code></div><div class="line number3 index2 alt2"><code class="preprocessor">#include<bits/stdc++.h> </code></div><div class="line number4 index3 alt1"><code class="keyword bold">using</code> <code class="keyword bold">namespace</code> <code class="plain">std; </code></div><div class="line number5 index4 alt2"><code class="undefined spaces"> </code> </div><div class="line number6 index5 alt1"><code class="comments">// Structure for a node </code></div><div class="line number7 index6 alt2"><code class="keyword bold">struct</code> <code class="plain">node{ </code></div><div class="line number8 index7 alt1"><code class="undefined spaces"> </code><code class="color1 bold">int</code> <code class="plain">data; </code></div><div class="line number9 index8 alt2"><code class="undefined spaces"> </code><code class="keyword bold">struct</code> <code class="plain">node *left, *right; </code></div><div class="line number10 index9 alt1"><code class="undefined spaces"> </code><code class="plain">node(</code><code class="color1 bold">int</code> <code class="plain">x) </code></div><div class="line number11 index10 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number12 index11 alt1"><code class="undefined spaces"> </code><code class="plain">data = x; </code></div><div class="line number13 index12 alt2"><code class="undefined spaces"> </code><code class="plain">left = right = NULL; </code></div><div class="line number14 index13 alt1"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number15 index14 alt2"><code class="plain">}; </code></div><div class="line number16 index15 alt1"><code class="undefined spaces"> </code> </div><div class="line number17 index16 alt2"><code class="comments">// Program to find kth ancestor </code></div><div class="line number18 index17 alt1"><code class="color1 bold">bool</code> <code class="plain">ancestor(</code><code class="keyword bold">struct</code> <code class="plain">node* root, </code><code class="color1 bold">int</code> <code class="plain">item, </code><code class="color1 bold">int</code> <code class="plain">&k) </code></div><div class="line number19 index18 alt2"><code class="plain">{ </code></div><div class="line number20 index19 alt1"><code class="undefined spaces"> </code><code class="keyword bold">if</code><code class="plain">(root == NULL) </code></div><div class="line number21 index20 alt2"><code class="undefined spaces"> </code><code class="keyword bold">return</code> <code class="keyword bold">false</code><code class="plain">; </code></div><div class="line number22 index21 alt1"><code class="undefined spaces"> </code> </div><div class="line number23 index22 alt2"><code class="undefined spaces"> </code><code class="comments">// Element whose ancestor is to be searched </code></div><div class="line number24 index23 alt1"><code class="undefined spaces"> </code><code class="keyword bold">if</code><code class="plain">(root->data == item) </code></div><div class="line number25 index24 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number26 index25 alt1"><code class="undefined spaces"> </code><code class="comments">//reduce count by 1 </code></div><div class="line number27 index26 alt2"><code class="undefined spaces"> </code><code class="plain">k = k-1; </code></div><div class="line number28 index27 alt1"><code class="undefined spaces"> </code><code class="keyword bold">return</code> <code class="keyword bold">true</code><code class="plain">; </code></div><div class="line number29 index28 alt2"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number30 index29 alt1"><code class="undefined spaces"> </code><code class="keyword bold">else</code></div><div class="line number31 index30 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number32 index31 alt1"><code class="undefined spaces"> </code> </div><div class="line number33 index32 alt2"><code class="undefined spaces"> </code><code class="comments">// Checking in left side </code></div><div class="line number34 index33 alt1"><code class="undefined spaces"> </code><code class="color1 bold">bool</code> <code class="plain">flag = ancestor(root->left,item,k); </code></div><div class="line number35 index34 alt2"><code class="undefined spaces"> </code><code class="keyword bold">if</code><code class="plain">(flag) </code></div><div class="line number36 index35 alt1"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number37 index36 alt2"><code class="undefined spaces"> </code><code class="keyword bold">if</code><code class="plain">(k == 0) </code></div><div class="line number38 index37 alt1"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number39 index38 alt2"><code class="undefined spaces"> </code> </div><div class="line number40 index39 alt1"><code class="undefined spaces"> </code><code class="comments">// If count = 0 i.e. element is found </code></div><div class="line number41 index40 alt2"><code class="undefined spaces"> </code><code class="plain">cout<<</code><code class="string">"["</code><code class="plain"><<root->data<<</code><code class="string">"] "</code><code class="plain">; </code></div><div class="line number42 index41 alt1"><code class="undefined spaces"> </code><code class="keyword bold">return</code> <code class="keyword bold">false</code><code class="plain">; </code></div><div class="line number43 index42 alt2"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number44 index43 alt1"><code class="undefined spaces"> </code> </div><div class="line number45 index44 alt2"><code class="undefined spaces"> </code><code class="comments">// if count !=0 i.e. this is not the </code></div><div class="line number46 index45 alt1"><code class="undefined spaces"> </code><code class="comments">// ancestor we are searching for </code></div><div class="line number47 index46 alt2"><code class="undefined spaces"> </code><code class="comments">// so decrement count </code></div><div class="line number48 index47 alt1"><code class="undefined spaces"> </code><code class="plain">k = k-1; </code></div><div class="line number49 index48 alt2"><code class="undefined spaces"> </code><code class="keyword bold">return</code> <code class="keyword bold">true</code><code class="plain">; </code></div><div class="line number50 index49 alt1"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number51 index50 alt2"><code class="undefined spaces"> </code> </div><div class="line number52 index51 alt1"><code class="undefined spaces"> </code><code class="comments">// Similarly Checking in right side </code></div><div class="line number53 index52 alt2"><code class="undefined spaces"> </code><code class="color1 bold">bool</code> <code class="plain">flag2 = ancestor(root->right,item,k); </code></div><div class="line number54 index53 alt1"><code class="undefined spaces"> </code><code class="keyword bold">if</code><code class="plain">(flag2) </code></div><div class="line number55 index54 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number56 index55 alt1"><code class="undefined spaces"> </code><code class="keyword bold">if</code><code class="plain">(k == 0) </code></div><div class="line number57 index56 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number58 index57 alt1"><code class="undefined spaces"> </code><code class="plain">cout<<</code><code class="string">"["</code><code class="plain"><<root->data<<</code><code class="string">"] "</code><code class="plain">; </code></div><div class="line number59 index58 alt2"><code class="undefined spaces"> </code><code class="keyword bold">return</code> <code class="keyword bold">false</code><code class="plain">; </code></div><div class="line number60 index59 alt1"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number61 index60 alt2"><code class="undefined spaces"> </code><code class="plain">k = k-1; </code></div><div class="line number62 index61 alt1"><code class="undefined spaces"> </code><code class="keyword bold">return</code> <code class="keyword bold">true</code><code class="plain">; </code></div><div class="line number63 index62 alt2"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number64 index63 alt1"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number65 index64 alt2"><code class="plain">} </code></div><div class="line number66 index65 alt1"><code class="undefined spaces"> </code> </div><div class="line number67 index66 alt2"><code class="comments">// Driver Code </code></div><div class="line number68 index67 alt1"><code class="color1 bold">int</code> <code class="plain">main() </code></div><div class="line number69 index68 alt2"><code class="plain">{ </code></div><div class="line number70 index69 alt1"><code class="undefined spaces"> </code><code class="keyword bold">struct</code> <code class="plain">node* root = </code><code class="keyword bold">new</code> <code class="plain">node(1); </code></div><div class="line number71 index70 alt2"><code class="undefined spaces"> </code><code class="plain">root->left = </code><code class="keyword bold">new</code> <code class="plain">node(4); </code></div><div class="line number72 index71 alt1"><code class="undefined spaces"> </code><code class="plain">root->left->right = </code><code class="keyword bold">new</code> <code class="plain">node(7); </code></div><div class="line number73 index72 alt2"><code class="undefined spaces"> </code><code class="plain">root->left->left = </code><code class="keyword bold">new</code> <code class="plain">node(3); </code></div><div class="line number74 index73 alt1"><code class="undefined spaces"> </code><code class="plain">root->left->right->left = </code><code class="keyword bold">new</code> <code class="plain">node(8); </code></div><div class="line number75 index74 alt2"><code class="undefined spaces"> </code><code class="plain">root->right = </code><code class="keyword bold">new</code> <code class="plain">node(2); </code></div><div class="line number76 index75 alt1"><code class="undefined spaces"> </code><code class="plain">root->right->right = </code><code class="keyword bold">new</code> <code class="plain">node(6); </code></div><div class="line number77 index76 alt2"><code class="undefined spaces"> </code> </div><div class="line number78 index77 alt1"><code class="undefined spaces"> </code><code class="color1 bold">int</code> <code class="plain">item,k; </code></div><div class="line number79 index78 alt2"><code class="undefined spaces"> </code><code class="plain">item = 3; </code></div><div class="line number80 index79 alt1"><code class="undefined spaces"> </code><code class="plain">k = 1; </code></div><div class="line number81 index80 alt2"><code class="undefined spaces"> </code><code class="color1 bold">int</code> <code class="plain">loc = k; </code></div><div class="line number82 index81 alt1"><code class="undefined spaces"> </code><code class="color1 bold">bool</code> <code class="plain">flag = ancestor(root,item,k); </code></div><div class="line number83 index82 alt2"><code class="undefined spaces"> </code><code class="keyword bold">if</code><code class="plain">(flag) </code></div><div class="line number84 index83 alt1"><code class="undefined spaces"> </code><code class="plain">cout<<</code><code class="string">"Ancestor doesn't exist\n"</code><code class="plain">; </code></div><div class="line number85 index84 alt2"><code class="undefined spaces"> </code><code class="keyword bold">else</code></div><div class="line number86 index85 alt1"><code class="undefined spaces"> </code><code class="plain">cout<<</code><code class="string">"is the "</code><code class="plain"><<loc<<</code><code class="string">"th ancestor of ["</code><code class="plain"><< </code></div><div class="line number87 index86 alt2"><code class="undefined spaces"> </code><code class="plain">item<<</code><code class="string">"]"</code><code class="plain"><<endl; </code></div><div class="line number88 index87 alt1"><code class="undefined spaces"> </code><code class="keyword bold">return</code> <code class="plain">0; </code></div><div class="line number89 index88 alt2"><code class="plain">} </code></div><div class="line number90 index89 alt1"><code class="undefined spaces"> </code> </div><div class="line number91 index90 alt2"><code class="comments">// This code is contributed by Sanjeev Yadav. </code></div></div></td></tr></tbody></table></div>
|
<div id= "highlighter_31437" class = "syntaxhighlighter nogutter " ><table border= "0" cellpadding= "0" cellspacing= "0" ><tbody><tr><td class = "code" ><div class = "container" ><div class = "line number1 index0 alt2" ><code class = "comments" > // Java program for finding </code></div><div class="line number2 index1 alt1"><code class="comments">// kth ancestor of a particular node </code></div><div class="line number3 index2 alt2"><code class="keyword">import</code> <code class="plain">java.io.*; </code></div><div class="line number4 index3 alt1"><code class="undefined spaces"> </code> </div><div class="line number5 index4 alt2"><code class="keyword">class</code> <code class="plain">Node </code></div><div class="line number6 index5 alt1"><code class="plain">{ </code></div><div class="line number7 index6 alt2"><code class="undefined spaces"> </code><code class="keyword">int</code> <code class="plain">data; </code></div><div class="line number8 index7 alt1"><code class="undefined spaces"> </code><code class="plain">Node left, right; </code></div><div class="line number9 index8 alt2"><code class="undefined spaces"> </code> </div><div class="line number10 index9 alt1"><code class="undefined spaces"> </code><code class="plain">Node(</code><code class="keyword">int</code> <code class="plain">x) </code></div><div class="line number11 index10 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number12 index11 alt1"><code class="undefined spaces"> </code><code class="keyword">this</code><code class="plain">.data = x; </code></div><div class="line number13 index12 alt2"><code class="undefined spaces"> </code><code class="keyword">this</code><code class="plain">.left = </code><code class="keyword">this</code><code class="plain">.right = </code><code class="keyword">null</code><code class="plain">; </code></div><div class="line number14 index13 alt1"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number15 index14 alt2"><code class="plain">} </code></div><div class="line number16 index15 alt1"><code class="undefined spaces"> </code> </div><div class="line number17 index16 alt2"><code class="keyword">class</code> <code class="plain">GFG{ </code></div><div class="line number18 index17 alt1"><code class="undefined spaces"> </code> </div><div class="line number19 index18 alt2"><code class="keyword">static</code> <code class="keyword">int</code> <code class="plain">k = </code><code class="value">1</code><code class="plain">; </code></div><div class="line number20 index19 alt1"><code class="undefined spaces"> </code> </div><div class="line number21 index20 alt2"><code class="keyword">static</code> <code class="keyword">boolean</code> <code class="plain">ancestor(Node root, </code><code class="keyword">int</code> <code class="plain">item) </code></div><div class="line number22 index21 alt1"><code class="plain">{ </code></div><div class="line number23 index22 alt2"><code class="undefined spaces"> </code><code class="keyword">if</code> <code class="plain">(root == </code><code class="keyword">null</code><code class="plain">) </code></div><div class="line number24 index23 alt1"><code class="undefined spaces"> </code><code class="keyword">return</code> <code class="keyword">false</code><code class="plain">; </code></div><div class="line number25 index24 alt2"><code class="undefined spaces"> </code> </div><div class="line number26 index25 alt1"><code class="undefined spaces"> </code><code class="comments">// Element whose ancestor is to be searched </code></div><div class="line number27 index26 alt2"><code class="undefined spaces"> </code><code class="keyword">if</code> <code class="plain">(root.data == item) </code></div><div class="line number28 index27 alt1"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number29 index28 alt2"><code class="undefined spaces"> </code> </div><div class="line number30 index29 alt1"><code class="undefined spaces"> </code><code class="comments">// Reduce count by 1 </code></div><div class="line number31 index30 alt2"><code class="undefined spaces"> </code><code class="plain">k = k-</code><code class="value">1</code><code class="plain">; </code></div><div class="line number32 index31 alt1"><code class="undefined spaces"> </code><code class="keyword">return</code> <code class="keyword">true</code><code class="plain">; </code></div><div class="line number33 index32 alt2"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number34 index33 alt1"><code class="undefined spaces"> </code><code class="keyword">else</code></div><div class="line number35 index34 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number36 index35 alt1"><code class="undefined spaces"> </code> </div><div class="line number37 index36 alt2"><code class="undefined spaces"> </code><code class="comments">// Checking in left side </code></div><div class="line number38 index37 alt1"><code class="undefined spaces"> </code><code class="keyword">boolean</code> <code class="plain">flag = ancestor(root.left, item); </code></div><div class="line number39 index38 alt2"><code class="undefined spaces"> </code><code class="keyword">if</code> <code class="plain">(flag) </code></div><div class="line number40 index39 alt1"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number41 index40 alt2"><code class="undefined spaces"> </code><code class="keyword">if</code> <code class="plain">(k == </code><code class="value">0</code><code class="plain">) </code></div><div class="line number42 index41 alt1"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number43 index42 alt2"><code class="undefined spaces"> </code> </div><div class="line number44 index43 alt1"><code class="undefined spaces"> </code><code class="comments">// If count = 0 i.e. element is found </code></div><div class="line number45 index44 alt2"><code class="undefined spaces"> </code><code class="plain">System.out.print(</code><code class="string">"["</code> <code class="plain">+ root.data + </code><code class="string">"] "</code><code class="plain">); </code></div><div class="line number46 index45 alt1"><code class="undefined spaces"> </code><code class="keyword">return</code> <code class="keyword">false</code><code class="plain">; </code></div><div class="line number47 index46 alt2"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number48 index47 alt1"><code class="undefined spaces"> </code> </div><div class="line number49 index48 alt2"><code class="undefined spaces"> </code><code class="comments">// If count !=0 i.e. this is not the </code></div><div class="line number50 index49 alt1"><code class="undefined spaces"> </code><code class="comments">// ancestor we are searching for </code></div><div class="line number51 index50 alt2"><code class="undefined spaces"> </code><code class="comments">// so decrement count </code></div><div class="line number52 index51 alt1"><code class="undefined spaces"> </code><code class="plain">k = k - </code><code class="value">1</code><code class="plain">; </code></div><div class="line number53 index52 alt2"><code class="undefined spaces"> </code><code class="keyword">return</code> <code class="keyword">true</code><code class="plain">; </code></div><div class="line number54 index53 alt1"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number55 index54 alt2"><code class="undefined spaces"> </code> </div><div class="line number56 index55 alt1"><code class="undefined spaces"> </code><code class="comments">// Similarly Checking in right side </code></div><div class="line number57 index56 alt2"><code class="undefined spaces"> </code><code class="keyword">boolean</code> <code class="plain">flag2 = ancestor(root.right, item); </code></div><div class="line number58 index57 alt1"><code class="undefined spaces"> </code><code class="keyword">if</code> <code class="plain">(flag2) </code></div><div class="line number59 index58 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number60 index59 alt1"><code class="undefined spaces"> </code><code class="keyword">if</code> <code class="plain">(k == </code><code class="value">0</code><code class="plain">) </code></div><div class="line number61 index60 alt2"><code class="undefined spaces"> </code><code class="plain">{ </code></div><div class="line number62 index61 alt1"><code class="undefined spaces"> </code><code class="plain">System.out.print(</code><code class="string">"["</code> <code class="plain">+ root.data + </code><code class="string">"] "</code><code class="plain">); </code></div><div class="line number63 index62 alt2"><code class="undefined spaces"> </code><code class="keyword">return</code> <code class="keyword">false</code><code class="plain">; </code></div><div class="line number64 index63 alt1"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number65 index64 alt2"><code class="undefined spaces"> </code><code class="plain">k = k - </code><code class="value">1</code><code class="plain">; </code></div><div class="line number66 index65 alt1"><code class="undefined spaces"> </code><code class="keyword">return</code> <code class="keyword">true</code><code class="plain">; </code></div><div class="line number67 index66 alt2"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number68 index67 alt1"><code class="undefined spaces"> </code><code class="plain">} </code></div><div class="line number69 index68 alt2"><code class="undefined spaces"> </code><code class="keyword">return</code> <code class="keyword">false</code><code class="plain">; </code></div><div class="line number70 index69 alt1"><code class="plain">} </code></div><div class="line number71 index70 alt2"><code class="undefined spaces"> </code> </div><div class="line number72 index71 alt1"><code class="comments">// Driver code </code></div><div class="line number73 index72 alt2"><code class="keyword">public</code> <code class="keyword">static</code> <code class="keyword">void</code> <code class="plain">main(String[] args) </code></div><div class="line number74 index73 alt1"><code class="plain">{ </code></div><div class="line number75 index74 alt2"><code class="undefined spaces"> </code><code class="plain">Node root = </code><code class="keyword">new</code> <code class="plain">Node(</code><code class="value">1</code><code class="plain">); </code></div><div class="line number76 index75 alt1"><code class="undefined spaces"> </code><code class="plain">root.left = </code><code class="keyword">new</code> <code class="plain">Node(</code><code class="value">4</code><code class="plain">); </code></div><div class="line number77 index76 alt2"><code class="undefined spaces"> </code><code class="plain">root.left.right = </code><code class="keyword">new</code> <code class="plain">Node(</code><code class="value">7</code><code class="plain">); </code></div><div class="line number78 index77 alt1"><code class="undefined spaces"> </code><code class="plain">root.left.left = </code><code class="keyword">new</code> <code class="plain">Node(</code><code class="value">3</code><code class="plain">); </code></div><div class="line number79 index78 alt2"><code class="undefined spaces"> </code><code class="plain">root.left.right.left = </code><code class="keyword">new</code> <code class="plain">Node(</code><code class="value">8</code><code class="plain">); </code></div><div class="line number80 index79 alt1"><code class="undefined spaces"> </code><code class="plain">root.right = </code><code class="keyword">new</code> <code class="plain">Node(</code><code class="value">2</code><code class="plain">); </code></div><div class="line number81 index80 alt2"><code class="undefined spaces"> </code><code class="plain">root.right.right = </code><code class="keyword">new</code> <code class="plain">Node(</code><code class="value">6</code><code class="plain">); </code></div><div class="line number82 index81 alt1"><code class="undefined spaces"> </code> </div><div class="line number83 index82 alt2"><code class="undefined spaces"> </code><code class="keyword">int</code> <code class="plain">item = </code><code class="value">3</code><code class="plain">; </code></div><div class="line number84 index83 alt1"><code class="undefined spaces"> </code><code class="keyword">int</code> <code class="plain">loc = k; </code></div><div class="line number85 index84 alt2"><code class="undefined spaces"> </code><code class="keyword">boolean</code> <code class="plain">flag = ancestor(root, item); </code></div><div class="line number86 index85 alt1"><code class="undefined spaces"> </code> </div><div class="line number87 index86 alt2"><code class="undefined spaces"> </code><code class="keyword">if</code> <code class="plain">(flag) </code></div><div class="line number88 index87 alt1"><code class="undefined spaces"> </code><code class="plain">System.out.println(</code><code class="string">"Ancestor doesn't exist"</code><code class="plain">); </code></div><div class="line number89 index88 alt2"><code class="undefined spaces"> </code><code class="keyword">else</code></div><div class="line number90 index89 alt1"><code class="undefined spaces"> </code><code class="plain">System.out.println(</code><code class="string">"is the "</code> <code class="plain">+ (loc) + </code></div><div class="line number91 index90 alt2"><code class="undefined spaces"> </code><code class="string">"th ancestor of ["</code> <code class="plain">+ </code></div><div class="line number92 index91 alt1"><code class="undefined spaces"> </code><code class="plain">(item) + </code><code class="string">"]"</code><code class="plain">); </code></div><div class="line number93 index92 alt2"><code class="plain">} </code></div><div class="line number94 index93 alt1"><code class="plain">} </code></div><div class="line number95 index94 alt2"><code class="undefined spaces"> </code> </div><div class="line number96 index95 alt1"><code class="comments">// This code is contributed by avanitrachhadiya2155</code></div></div></td></tr></tbody></table></div>
|
# Python3 program for finding # kth ancestor of a particular node # Structure for a node class node:
def __init__( self , data):
self .left = None
self .right = None
self .data = data
# Program to find kth ancestor def ancestor(root, item):
global k
if (root = = None ):
return False
# Element whose ancestor is
# to be searched
if (root.data = = item):
# Reduce count by 1
k = k - 1
return True
else :
# Checking in left side
flag = ancestor(root.left, item);
if (flag):
if (k = = 0 ):
# If count = 0 i.e. element is found
print ( "[" + str (root.data) + "]" , end = ' ' )
return False
# If count !=0 i.e. this is not the
# ancestor we are searching for
# so decrement count
k = k - 1
return True
# Similarly Checking in right side
flag2 = ancestor(root.right, item)
if (flag2):
if (k = = 0 ):
print ( "[" + str (root.data) + "]" )
return False
k = k - 1
return True
# Driver code if __name__ = = "__main__" :
root = node( 1 )
root.left = node( 4 )
root.left.right = node( 7 )
root.left.left = node( 3 )
root.left.right.left = node( 8 )
root.right = node( 2 )
root.right.right = node( 6 )
item = 3
k = 1
loc = k
flag = ancestor(root, item)
if (flag):
print ( "Ancestor doesn't exist" )
else :
print ( "is the " + str (loc) + "th ancestor of [" + str (item) + "]" )
# This code is contributed by rutvik_56 |
// C# program for finding // kth ancestor of a particular node using System;
// Structure for a node public class Node
{ public int data;
public Node left, right;
public Node( int x)
{
this .data = x;
this .left = this .right = null ;
}
} class GFG{
static int k = 1;
// Program to find kth ancestor static bool ancestor(Node root, int item)
{ if (root == null )
return false ;
// Element whose ancestor is
// to be searched
if (root.data == item)
{
// Reduce count by 1
k = k - 1;
return true ;
}
else
{
// Checking in left side
bool flag = ancestor(root.left, item);
if (flag)
{
if (k == 0)
{
// If count = 0 i.e. element is found
Console.Write( "[" + root.data + "] " );
return false ;
}
// If count !=0 i.e. this is not the
// ancestor we are searching for
// so decrement count
k = k - 1;
return true ;
}
// Similarly Checking in right side
bool flag2 = ancestor(root.right, item);
if (flag2)
{
if (k == 0)
{
Console.Write( "[" + root.data + "] " );
return false ;
}
k = k - 1;
return true ;
}
}
return false ;
} // Driver code static public void Main()
{ Node root = new Node(1);
root.left = new Node(4);
root.left.right = new Node(7);
root.left.left = new Node(3);
root.left.right.left = new Node(8);
root.right = new Node(2);
root.right.right = new Node(6);
int item = 3;
int loc = k;
bool flag = ancestor(root, item);
if (flag)
Console.WriteLine( "Ancestor doesn't exist" );
else
Console.WriteLine( "is the " + (loc) +
"th ancestor of [" +
(item) + "]" );
} } // This code is contributed by patel2127 |
<div id= "highlighter_335838" class= "syntaxhighlighter nogutter " ><table border= "0" cellpadding= "0" cellspacing= "0" ><tbody><tr><td class= "code" ><div class= "container" ><div class= "line number1 index0 alt2" ><code class= "plain" ><script> </code></div><div class= "line number2 index1 alt1" ><code class= "undefined spaces" > </code> </div><div class= "line number3 index2 alt2" ><code class= "plain" >class Node </code></div><div class= "line number4 index3 alt1" ><code class= "plain" >{ </code></div><div class= "line number5 index4 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >constructor(x) </code></div><div class= "line number6 index5 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >{ </code></div><div class= "line number7 index6 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > this </code><code class= "plain" >.data=x; </code></div><div class= "line number8 index7 alt1" ><code class= "undefined spaces" > </code><code class= "keyword" > this </code><code class= "plain" >.left = </code><code class= "keyword" > this </code><code class= "plain" >.right = </code><code class= "keyword" > null </code><code class= "plain" >; </code></div><div class= "line number9 index8 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >} </code></div><div class= "line number10 index9 alt1" ><code class= "plain" >} </code></div><div class= "line number11 index10 alt2" ><code class= "undefined spaces" > </code> </div><div class= "line number12 index11 alt1" ><code class= "keyword" > function </code> <code class= "plain" >ancestor(root, item) </code></div><div class= "line number13 index12 alt2" ><code class= "plain" >{ </code></div><div class= "line number14 index13 alt1" ><code class= "undefined spaces" > </code><code class= "keyword" > if </code> <code class= "plain" >(root == </code><code class= "keyword" > null </code><code class= "plain" >) </code></div><div class= "line number15 index14 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >{ </code></div><div class= "line number16 index15 alt1" ><code class= "undefined spaces" > </code><code class= "keyword" > return </code> <code class= "keyword" > false </code><code class= "plain" >; </code></div><div class= "line number17 index16 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >} </code></div><div class= "line number18 index17 alt1" ><code class= "undefined spaces" > </code> </div><div class= "line number19 index18 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > if </code> <code class= "plain" >(root.data == item) </code></div><div class= "line number20 index19 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >{ </code></div><div class= "line number21 index20 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >k = k - 1; </code></div><div class= "line number22 index21 alt1" ><code class= "undefined spaces" > </code><code class= "keyword" > return </code> <code class= "keyword" > true </code><code class= "plain" >; </code></div><div class= "line number23 index22 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >} </code></div><div class= "line number24 index23 alt1" ><code class= "undefined spaces" > </code> </div><div class= "line number25 index24 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > else </code></div><div class= "line number26 index25 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >{ </code></div><div class= "line number27 index26 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >let flag = ancestor(root.left, item); </code></div><div class= "line number28 index27 alt1" ><code class= "undefined spaces" > </code><code class= "keyword" > if </code> <code class= "plain" >(flag) </code></div><div class= "line number29 index28 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >{ </code></div><div class= "line number30 index29 alt1" ><code class= "undefined spaces" > </code><code class= "keyword" > if </code> <code class= "plain" >(k == 0) </code></div><div class= "line number31 index30 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >{ </code></div><div class= "line number32 index31 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >document.write(</code><code class= "string" > "[" </code> <code class= "plain" >+ (root.data) + </code><code class= "string" > "] " </code><code class= "plain" >); </code></div><div class= "line number33 index32 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > return </code> <code class= "keyword" > false </code><code class= "plain" >; </code></div><div class= "line number34 index33 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >} </code></div><div class= "line number35 index34 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >k = k - 1; </code></div><div class= "line number36 index35 alt1" ><code class= "undefined spaces" > </code><code class= "keyword" > return </code> <code class= "keyword" > true </code><code class= "plain" >; </code></div><div class= "line number37 index36 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >} </code></div><div class= "line number38 index37 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >let flag2 = ancestor(root.right, item); </code></div><div class= "line number39 index38 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > if </code> <code class= "plain" >(flag2) </code></div><div class= "line number40 index39 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >{ </code></div><div class= "line number41 index40 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > if </code> <code class= "plain" >(k == 0) </code></div><div class= "line number42 index41 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >{ </code></div><div class= "line number43 index42 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >document.write(</code><code class= "string" > "[" </code> <code class= "plain" >+ (root.data) + </code><code class= "string" > "] " </code><code class= "plain" >); </code></div><div class= "line number44 index43 alt1" ><code class= "undefined spaces" > </code><code class= "keyword" > return </code> <code class= "keyword" > false </code><code class= "plain" >; </code></div><div class= "line number45 index44 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >} </code></div><div class= "line number46 index45 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >k = k - 1; </code></div><div class= "line number47 index46 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > return </code> <code class= "keyword" > true </code><code class= "plain" >; </code></div><div class= "line number48 index47 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >} </code></div><div class= "line number49 index48 alt2" ><code class= "undefined spaces" > </code> </div><div class= "line number50 index49 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >} </code></div><div class= "line number51 index50 alt2" ><code class= "plain" >} </code></div><div class= "line number52 index51 alt1" ><code class= "undefined spaces" > </code> </div><div class= "line number53 index52 alt2" ><code class= "plain" >let root = </code><code class= "keyword" > new </code> <code class= "plain" >Node(1) </code></div><div class= "line number54 index53 alt1" ><code class= "plain" >root.left = </code><code class= "keyword" > new </code> <code class= "plain" >Node(4) </code></div><div class= "line number55 index54 alt2" ><code class= "plain" >root.left.right = </code><code class= "keyword" > new </code> <code class= "plain" >Node(7) </code></div><div class= "line number56 index55 alt1" ><code class= "plain" >root.left.left = </code><code class= "keyword" > new </code> <code class= "plain" >Node(3) </code></div><div class= "line number57 index56 alt2" ><code class= "plain" >root.left.right.left = </code><code class= "keyword" > new </code> <code class= "plain" >Node(8) </code></div><div class= "line number58 index57 alt1" ><code class= "plain" >root.right = </code><code class= "keyword" > new </code> <code class= "plain" >Node(2) </code></div><div class= "line number59 index58 alt2" ><code class= "plain" >root.right.right = </code><code class= "keyword" > new </code> <code class= "plain" >Node(6) </code></div><div class= "line number60 index59 alt1" ><code class= "plain" >let item = 3 </code></div><div class= "line number61 index60 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >let k = 1 </code></div><div class= "line number62 index61 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >let loc = k </code></div><div class= "line number63 index62 alt2" ><code class= "undefined spaces" > </code><code class= "plain" >let flag = ancestor(root, item) </code></div><div class= "line number64 index63 alt1" ><code class= "undefined spaces" > </code> </div><div class= "line number65 index64 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > if </code> <code class= "plain" >(flag) </code></div><div class= "line number66 index65 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >document.write(</code><code class= "string" > "Ancestor doesn't exist" </code><code class= "plain" >) </code></div><div class= "line number67 index66 alt2" ><code class= "undefined spaces" > </code><code class= "keyword" > else </code></div><div class= "line number68 index67 alt1" ><code class= "undefined spaces" > </code><code class= "plain" >document.write(</code><code class= "string" > "is the " </code> <code class= "plain" >+ (loc) + </code></div><div class= "line number69 index68 alt2" ><code class= "undefined spaces" > </code><code class= "string" > "th ancestor of [" </code> <code class= "plain" >+ (item) + </code><code class= "string" > "]" </code><code class= "plain" >) </code></div><div class= "line number70 index69 alt1" ><code class= "undefined spaces" > </code> </div><div class= "line number71 index70 alt2" ><code class= "comments" > // This code is contributed by rag2127 </code></div><div class="line number72 index71 alt1"><code class="undefined spaces"> </code> </div><div class="line number73 index72 alt2"><code class="plain"></script> </code></div></div></td></tr></tbody></table></div>
|
[4] is the 1th ancestor of [3]
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 3: Iterative Approach
The basic idea behind the iterative approach is to traverse the binary tree from the root node and keep track of the path from the root to the target node using a stack. Once we find the target node, we pop elements from the stack and add their values to a vector until we reach the kth ancestor or the stack becomes empty
Follow the Steps below to implement the above idea:
- Initialize a stack to keep track of the path from the root to the target node, and a vector to store the ancestors.
- Traverse the binary tree from the root node using a while loop.
- If the current node is not NULL, push it onto the stack and move to its left child.
- If the current node is NULL, pop the top element from the stack. If the top element is the target node, break out of the loop. Otherwise, move to its right child.
- If the target node is not found, return -1.
- Pop elements from the stack and add their values to the ancestors vector until we reach the kth ancestor or the stack becomes empty.
- If the stack becomes empty before we reach the kth ancestor, return -1.
- Return the value of the kth ancestor
Below is the implementation of the above approach:
// JavaScript code to implement the iterative approach // Definition for a binary tree node. class TreeNode { constructor(x) { this .val = x;
this .left = null ;
this .right = null ;
} } // Function to find the kth ancestor of // the given node using iterative approach function kthAncestor(root, node, k) {
// Initialize a stack to keep track of // the path from the root to the target node const s = []; const ancestors = []; let found = false ;
// Traverse the binary tree from the root node while (root || s.length > 0) {
// If the current node is not null, push it onto the stack and move to its left child
if (root) {
s.push(root);
root = root.left;
}
// If the current node is null, pop the top element from the stack
// If the top element is the target node, break out of the loop
// Otherwise, move to its right child
else {
const temp = s.pop();
if (temp.val === node) {
found = true ;
break ;
}
if (temp.right) {
root = temp.right;
}
}
} // If the target node is not found, return -1 if (!found) {
return -1;
} // Pop elements from the stack and add their values to the ancestors vector // until we reach the kth ancestor or the stack becomes empty while (s.length > 0 && k > 0) {
const temp = s.pop();
ancestors.push(temp.val);
k--;
} // If the stack becomes empty before we reach the kth ancestor, return -1 if (k > 0) {
return -1;
} // Return the value of the kth ancestor return ancestors[ancestors.length - 1];
} // Driver code /* Example tree: 1 / 2 3 / 4 5 */ const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
const node = 4; const k = 2; const kthAncestorVal = kthAncestor(root, node, k); console.log(`The ${k}th ancestor of node ${node} is ${kthAncestorVal}`); // This code is contributed by akashish__ |
The 2th ancestor of node 4 is 1
Time Complexity: O(N) , where N is the number of nodes in the binary tree. This is because we need to traverse the entire tree in the worst case to find the target node and the ancestors.
Space Complexity: O(N) , where N is the number of nodes in the binary tree. This is because we are using a stack to keep track of the path from the root to the target node, and in the worst case, the entire path could be stored in the stack