Related Articles

# Find distance from root to given node in a binary tree

• Difficulty Level : Medium
• Last Updated : 24 Jun, 2021

Given the root of a binary tree and a key x in it, find the distance of the given key from the root. Dis­tance means the num­ber of edges between two nodes.

Examples:

```Input : x = 45,
Root of below tree
5
/    \
10      15
/ \    /  \
20  25  30   35
\
45
Output : Distance = 3
There are three edges on path
from root to 45.

For more understanding of question,
in above tree distance of 35 is two
and distance of 10 is 1.```

Approach: The idea is to traverse the tree from the root. Check if x is present at the root or in the left subtree or in the right subtree. We initialize distance as -1 and add 1 to distance for all three cases.

## C++

 `// C++ program to find distance of a given``// node from root.``#include ``using` `namespace` `std;` `// A Binary Tree Node``struct` `Node``{``    ``int` `data;``    ``Node *left, *right;``};` `// A utility function to create a new Binary``// Tree Node``Node *newNode(``int` `item)``{``    ``Node *temp = ``new` `Node;``    ``temp->data = item;``    ``temp->left = temp->right = NULL;``    ``return` `temp;``}` `// Returns -1 if x doesn't exist in tree. Else``// returns distance of x from root``int` `findDistance(Node *root, ``int` `x)``{``    ``// Base case``    ``if` `(root == NULL)``      ``return` `-1;` `    ``// Initialize distance``    ``int` `dist = -1;` `    ``// Check if x is present at root or in left``    ``// subtree or right subtree.``    ``if` `((root->data == x) ||``        ``(dist = findDistance(root->left, x)) >= 0 ||``        ``(dist = findDistance(root->right, x)) >= 0)``        ``return` `dist + 1;` `    ``return` `dist;``}` `// Driver Program to test above functions``int` `main()``{``    ``Node *root = newNode(5);``    ``root->left = newNode(10);``    ``root->right = newNode(15);``    ``root->left->left = newNode(20);``    ``root->left->right = newNode(25);``    ``root->left->right->right = newNode(45);``    ``root->right->left = newNode(30);``    ``root->right->right = newNode(35);` `    ``cout << findDistance(root, 45);``    ``return` `0;``}`

## Java

 `// Java program to find distance of a given``// node from root.``import` `java.util.*;``class` `GfG {` `// A Binary Tree Node``static` `class` `Node``{``    ``int` `data;``    ``Node left, right;``}` `// A utility function to create a new Binary``// Tree Node``static` `Node newNode(``int` `item)``{``    ``Node temp = ``new` `Node();``    ``temp.data = item;``    ``temp.left = ``null``;``    ``temp.right = ``null``;``    ``return` `temp;``}` `// Returns -1 if x doesn't exist in tree. Else``// returns distance of x from root``static` `int` `findDistance(Node root, ``int` `x)``{``    ``// Base case``    ``if` `(root == ``null``)``    ``return` `-``1``;` `    ``// Initialize distance``    ``int` `dist = -``1``;` `    ``// Check if x is present at root or in left``    ``// subtree or right subtree.``    ``if` `((root.data == x) ||``        ``(dist = findDistance(root.left, x)) >= ``0` `||``        ``(dist = findDistance(root.right, x)) >= ``0``)``        ``return` `dist + ``1``;` `    ``return` `dist;``}` `// Driver Program to test above functions``public` `static` `void` `main(String[] args)``{``    ``Node root = newNode(``5``);``    ``root.left = newNode(``10``);``    ``root.right = newNode(``15``);``    ``root.left.left = newNode(``20``);``    ``root.left.right = newNode(``25``);``    ``root.left.right.right = newNode(``45``);``    ``root.right.left = newNode(``30``);``    ``root.right.right = newNode(``35``);` `    ``System.out.println(findDistance(root, ``45``));``}``}`

## Python3

 `# Python3 program to find distance of``# a given node from root.` `# A class to create a new Binary``# Tree Node``class` `newNode:``    ``def` `__init__(``self``, item):``        ``self``.data ``=` `item``        ``self``.left ``=` `self``.right ``=` `None` `# Returns -1 if x doesn't exist in tree.``# Else returns distance of x from root``def` `findDistance(root, x):``    ` `    ``# Base case``    ``if` `(root ``=``=` `None``):``        ``return` `-``1` `    ``# Initialize distance``    ``dist ``=` `-``1` `    ``# Check if x is present at root or``    ``# in left subtree or right subtree.``    ``if` `(root.data ``=``=` `x):``        ``return` `dist ``+` `1``    ``else``:``        ``dist ``=` `findDistance(root.left, x)``        ``if` `dist >``=` `0``:``            ``return` `dist ``+` `1``        ``else``:``            ``dist ``=` `findDistance(root.right, x)``            ``if` `dist >``=` `0``:``                ``return` `dist ``+` `1` `    ``return` `dist` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:` `    ``root ``=` `newNode(``5``)``    ``root.left ``=` `newNode(``10``)``    ``root.right ``=` `newNode(``15``)``    ``root.left.left ``=` `newNode(``20``)``    ``root.left.right ``=` `newNode(``25``)``    ``root.left.right.right ``=` `newNode(``45``)``    ``root.right.left ``=` `newNode(``30``)``    ``root.right.right ``=` `newNode(``35``)` `    ``print``(findDistance(root, ``45``))` `# This code is contributed by PranchalK`

## C#

 `// C# program to find distance of a given``// node from root.``using` `System;` `class` `GfG``{` `    ``// A Binary Tree Node``    ``class` `Node``    ``{``        ``public` `int` `data;``        ``public` `Node left, right;``    ``}` `    ``// A utility function to create ``    ``// a new Binary Tree Node``    ``static` `Node newNode(``int` `item)``    ``{``        ``Node temp = ``new` `Node();``        ``temp.data = item;``        ``temp.left = ``null``;``        ``temp.right = ``null``;``        ``return` `temp;``    ``}` `    ``// Returns -1 if x doesn't exist in tree. Else``    ``// returns distance of x from root``    ``static` `int` `findDistance(Node root, ``int` `x)``    ``{``        ``// Base case``        ``if` `(root == ``null``)``        ``return` `-1;` `        ``// Initialize distance``        ``int` `dist = -1;` `        ``// Check if x is present at root or in left``        ``// subtree or right subtree.``        ``if` `((root.data == x) ||``            ``(dist = findDistance(root.left, x)) >= 0 ||``            ``(dist = findDistance(root.right, x)) >= 0)``            ``return` `dist + 1;` `        ``return` `dist;``    ``}` `    ``// Driver code``    ``public` `static` `void` `Main(String[] args)``    ``{``        ``Node root = newNode(5);``        ``root.left = newNode(10);``        ``root.right = newNode(15);``        ``root.left.left = newNode(20);``        ``root.left.right = newNode(25);``        ``root.left.right.right = newNode(45);``        ``root.right.left = newNode(30);``        ``root.right.right = newNode(35);` `        ``Console.WriteLine(findDistance(root, 45));``    ``}``}` `// This code is contributed by 29AjayKumar`

## Javascript

 ``

Output:

`3`

Time Complexity: O(N)

Auxiliary Space: O(1)

This article is contributed by Roshni Agarwal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.