# Find the Kth node in the DFS traversal of a given subtree in a Tree

• Difficulty Level : Basic
• Last Updated : 27 Jan, 2022

Given a tree with N nodes, and two integers K and V. The task is to find the Kth node in the DFS traversal of the vertex V.
Consider the below Tree: DFS of node number 1 is [1, 2, 3, 5, 6, 8, 7, 9, 4].
DFS of node number 3 is [3, 5, 6, 8, 7, 9]
DFS of node number 7 is [7, 9]
DFS of node number 9 is .

Print “-1” if the numbers in the DFS of vertex V are less than K.

Examples:

```Input : Tree: Shown in above image, V = 3, K = 4
Output : 8

Input : Tree: Shown in above image, V = 7, K = 3
Output : -1```

Approach : Let’s construct a vector p: to store the DFS traversal of the complete tree from vertex 1. Let tinv be the position of the vertex V in the vector p (the size of the vector p in moment we call DFS from the vertex V) and toutv be the position of the first vertex pushed to the vector after leaving the subtree of vertex V (the size of the vector p in moment when we return from DFS from the vertex V). Then it is obvious that the subtree of the vertex V lies in the interval [tinv, toutv).
So, to find the Kth node in the DFS of the subtree of node V, we will have to return the Kth node in the interval [tinv, toutv).

Below is the implementation of the above approach:

## C++

 `// C++ program to find the Kth node in the``// DFS traversal of the subtree of given``// vertex V in a Tree` `#include ``using` `namespace` `std;``#define N 100005` `// To store nodes``int` `n;``vector<``int``> tree[N];` `// To store the current index of vertex in DFS``int` `currentIdx;` `// To store the starting index and ending``// index of vertex in the DFS traversal array``vector<``int``> startIdx, endIdx;` `// To store the DFS of vertex 1``vector<``int``> p;` `// Function to add edge between two nodes``void` `Add_edge(``int` `u, ``int` `v)``{``    ``tree[u].push_back(v);``    ``tree[v].push_back(u);``}` `// Initialize the vectors``void` `intisalise()``{``    ``startIdx.resize(n);``    ``endIdx.resize(n);``    ``p.resize(n);``}` `// Function to perform DFS of a vertex``// 1. stores the DFS of the vertex 1 in vector p,``// 2. store the start index of DFS of every vertex``// 3. store the end index of DFS of every vertex``void` `Dfs(``int` `ch, ``int` `par)``{``    ``p[currentIdx] = ch;` `    ``// store starting index of node ch``    ``startIdx[ch] = currentIdx++;` `    ``for` `(``auto` `c : tree[ch]) {``        ``if` `(c != par)``            ``Dfs(c, ch);``    ``}` `    ``// store ending index``    ``endIdx[ch] = currentIdx - 1;``}` `// Function to find the Kth node in DFS of vertex V``int` `findNode(``int` `v, ``int` `k)``{``    ``k += startIdx[v] - 1;` `    ``// check if kth number exits or not``    ``if` `(k <= endIdx[v])``        ``return` `p[k];` `    ``return` `-1;``}` `// Driver code``int` `main()``{``    ``// number of nodes``    ``n = 9;` `    ``// add edges``    ``Add_edge(1, 2);``    ``Add_edge(1, 3);``    ``Add_edge(1, 4);``    ``Add_edge(3, 5);``    ``Add_edge(3, 7);``    ``Add_edge(5, 6);``    ``Add_edge(5, 8);``    ``Add_edge(7, 9);` `    ``intisalise();` `    ``// store DFS of 1st node``    ``Dfs(1, 0);` `    ``int` `v = 3, k = 4;` `    ``cout << findNode(v, k);` `    ``return` `0;``}`

## Java

 `// Java program to find the Kth node in the``// DFS traversal of the subtree of given``// vertex V in a Tree``import` `java.util.*;` `class` `GFG{``    ` `static` `int` `N = ``100005``;` `// To store nodes``static` `int` `n;` `static` `ArrayList<``       ``ArrayList> tree = ``new` `ArrayList<>();` `// To store the current index of vertex in DFS``static` `int` `currentIdx;` `// To store the starting index and ending``// index of vertex in the DFS traversal array``static` `int``[] startIdx;``static` `int``[] endIdx;` `// To store the DFS of vertex 1``static` `int``[] p;` `// Function to add edge between two nodes``static` `void` `Add_edge(``int` `u, ``int` `v)``{``    ``tree.get(u).add(v);``    ``tree.get(v).add(u);``}` `// Initialize the vectors``static` `void` `intisalise()``{``    ``startIdx = ``new` `int``[n + ``1``];``    ``endIdx = ``new` `int``[n + ``1``];``    ``p = ``new` `int``[n + ``1``];``}` `// Function to perform DFS of a vertex``// 1. stores the DFS of the vertex 1 in vector p,``// 2. store the start index of DFS of every vertex``// 3. store the end index of DFS of every vertex``static` `void` `Dfs(``int` `ch, ``int` `par)``{``    ``p[currentIdx] = ch;` `    ``// store starting index of node ch``    ``startIdx[ch] = currentIdx++;` `    ``for``(``int` `c : tree.get(ch))``    ``{``        ``if` `(c != par)``            ``Dfs(c, ch);``    ``}` `    ``// store ending index``    ``endIdx[ch] = currentIdx - ``1``;``}` `// Function to find the Kth node``// in DFS of vertex V``static` `int` `findNode(``int` `v, ``int` `k)``{``    ``k += startIdx[v] - ``1``;` `    ``// Check if kth number exits or not``    ``if` `(k <= endIdx[v])``        ``return` `p[k];` `    ``return` `-``1``;``}` `// Driver code``public` `static` `void` `main(String[] args)``{``    ` `    ``// Number of nodes``    ``n = ``9``;` `    ``for``(``int` `i = ``0``; i <= n; i++)``        ``tree.add(``new` `ArrayList());``        ` `    ``// Add edges``    ``Add_edge(``1``, ``2``);``    ``Add_edge(``1``, ``3``);``    ``Add_edge(``1``, ``4``);``    ``Add_edge(``3``, ``5``);``    ``Add_edge(``3``, ``7``);``    ``Add_edge(``5``, ``6``);``    ``Add_edge(``5``, ``8``);``    ``Add_edge(``7``, ``9``);` `    ``intisalise();` `    ``// Store DFS of 1st node``    ``Dfs(``1``, ``0``);` `    ``int` `v = ``3``, k = ``4``;` `    ``System.out.println(findNode(v, k));``}``}` `// This code is contributed by jrishabh99`

## Python3

 `# Python3 program to find the Kth node in the``# DFS traversal of the subtree of given``# vertex V in a Tree``N ``=` `100005` `n ``=` `10``tree ``=` `[[]``for` `i ``in` `range``(N)]` `# To store the current index of vertex in DFS``currentIdx ``=` `0` `# To store the starting index and ending``# index of vertex in the DFS traversal array``startIdx ``=` `[``0` `for` `i ``in` `range``(n)]``endIdx ``=` `[``0` `for` `i ``in` `range``(n)]` `# To store the DFS of vertex 1``p ``=` `[``0` `for` `i ``in` `range``(n)]` `# Function to add edge between two nodes``def` `Add_edge(u, v):``    ``tree[u].append(v)``    ``tree[v].append(u)` `# Initialize the vectors``def` `intisalise():``    ``pass` `# Function to perform DFS of a vertex``# 1. stores the DFS of the vertex 1 in vector p,``# 2. store the start index of DFS of every vertex``# 3. store the end index of DFS of every vertex``def` `Dfs(ch, par):``    ``global` `currentIdx` `    ``p[currentIdx] ``=` `ch` `    ``# store starting index of node ch``    ``startIdx[ch] ``=` `currentIdx``    ``currentIdx ``+``=` `1` `    ``for` `c ``in` `tree[ch]:``        ``if` `(c !``=` `par):``            ``Dfs(c, ch)` `    ``# store ending index``    ``endIdx[ch] ``=` `currentIdx ``-` `1` `# Function to find the Kth node in``# DFS of vertex V``def` `findNode(v, k):` `    ``k ``+``=` `startIdx[v] ``-` `1` `    ``# check if kth number exits or not``    ``if` `(k <``=` `endIdx[v]):``        ``return` `p[k]` `    ``return` `-``1` `# Driver code` `# number of nodes``n ``=` `9` `# add edges``Add_edge(``1``, ``2``)``Add_edge(``1``, ``3``)``Add_edge(``1``, ``4``)``Add_edge(``3``, ``5``)``Add_edge(``3``, ``7``)``Add_edge(``5``, ``6``)``Add_edge(``5``, ``8``)``Add_edge(``7``, ``9``)` `intisalise()` `# store DFS of 1st node``Dfs(``1``, ``0``)` `v, k ``=` `3``, ``4` `print``(findNode(v, k))` `# This code is contributed by mohit kumar`

## C#

 `// C# program to find the Kth node in the``// DFS traversal of the subtree of given``// vertex V in a Tree``using` `System;``using` `System.Collections;``using` `System.Collections.Generic;``  ` `class` `GFG{``  ` `// To store nodes``static` `int` `n;``  ` `static` `ArrayList tree = ``new` `ArrayList();``  ` `// To store the current index of vertex in DFS``static` `int` `currentIdx;``  ` `// To store the starting index and ending``// index of vertex in the DFS traversal array``static` `int``[] startIdx;``static` `int``[] endIdx;``  ` `// To store the DFS of vertex 1``static` `int``[] p;``  ` `// Function to add edge between two nodes``static` `void` `Add_edge(``int` `u, ``int` `v)``{``    ``((ArrayList)tree[u]).Add(v);``    ``((ArrayList)tree[v]).Add(u);``}``  ` `// Initialize the vectors``static` `void` `intisalise()``{``    ``startIdx = ``new` `int``[n + 1];``    ``endIdx = ``new` `int``[n + 1];``    ``p = ``new` `int``[n + 1];``}``  ` `// Function to perform DFS of a vertex``// 1. stores the DFS of the vertex 1 in vector p,``// 2. store the start index of DFS of every vertex``// 3. store the end index of DFS of every vertex``static` `void` `Dfs(``int` `ch, ``int` `par)``{``    ``p[currentIdx] = ch;``  ` `    ``// store starting index of node ch``    ``startIdx[ch] = currentIdx++;``  ` `    ``foreach``(``int` `c ``in` `(ArrayList)tree[ch])``    ``{``        ``if` `(c != par)``            ``Dfs(c, ch);``    ``}``  ` `    ``// store ending index``    ``endIdx[ch] = currentIdx - 1;``}``  ` `// Function to find the Kth node ``// in DFS of vertex V``static` `int` `findNode(``int` `v, ``int` `k)``{``    ``k += startIdx[v] - 1;``  ` `    ``// Check if kth number exits or not``    ``if` `(k <= endIdx[v])``        ``return` `p[k];``  ` `    ``return` `-1;``}``  ` `// Driver code``public` `static` `void` `Main(``string``[] args)``{``    ` `    ``// Number of nodes``    ``n = 9;``  ` `    ``for``(``int` `i = 0; i <= n; i++)``        ``tree.Add(``new` `ArrayList());``          ` `    ``// Add edges``    ``Add_edge(1, 2);``    ``Add_edge(1, 3);``    ``Add_edge(1, 4);``    ``Add_edge(3, 5);``    ``Add_edge(3, 7);``    ``Add_edge(5, 6);``    ``Add_edge(5, 8);``    ``Add_edge(7, 9);``  ` `    ``intisalise();``  ` `    ``// Store DFS of 1st node``    ``Dfs(1, 0);``  ` `    ``int` `v = 3, k = 4;``  ` `    ``Console.Write(findNode(v, k));``}``}` `// This code is contributed by rutvik_56`

## Javascript

 ``

Output:

`8`

My Personal Notes arrow_drop_up