Open in App
Not now

# Height of n-ary tree if parent array is given

• Difficulty Level : Easy
• Last Updated : 08 Mar, 2023

Given a parent array P, where P[i] indicates the parent of the ith node in the tree(assume parent of root node id indicated with -1). Find the height of the tree.

Examples:

```Input : array[] = [-1 0 1 6 6 0 0 2 7]
Output : height = 5
Tree formed is:
0
/ | \
5  1  6
/   | \
2    4  3
/
7
/
8   ```
1. Start at each node and keep going to its parent until we reach -1.
2. Also, keep track of the maximum height between all nodes.

Implementation:

## C++

 `// C++ program to find the height of the generic` `// tree(n-ary tree) if parent array is given` `#include ` `using` `namespace` `std;`   `// function to find the height of tree` `int` `findHeight(``int``* parent, ``int` `n)` `{` `    ``int` `res = 0;`   `    ``// Traverse each node` `    ``for` `(``int` `i = 0; i < n; i++) {`   `        ``// traverse to parent until -1` `        ``// is reached` `        ``int` `p = i, current = 1;` `        ``while` `(parent[p] != -1) {` `            ``current++;` `            ``p = parent[p];` `        ``}`   `        ``res = max(res, current);` `    ``}` `    ``return` `res;` `}`   `// Driver program` `int` `main()` `{` `    ``int` `parent[] = { -1, 0, 1, 6, 6, 0, 0, 2, 7 };` `    ``int` `n = ``sizeof``(parent) / ``sizeof``(parent[0]);` `    ``int` `height = findHeight(parent, n);` `    ``cout << ``"Height of the given tree is: "` `         ``<< height << endl;` `    ``return` `0;` `}`

## Java

 `// Java program to find the height of` `// the generic tree(n-ary tree) if` `// parent array is given` `import` `java.io.*;`   `public` `class` `GFG {`   `    ``// function to find the height of tree` `    ``static` `int` `findHeight(``int``[] parent, ``int` `n)` `    ``{` `        ``int` `res = ``0``;`   `        ``// Traverse each node` `        ``for` `(``int` `i = ``0``; i < n; i++) {`   `            ``// traverse to parent until -1` `            ``// is reached` `            ``int` `p = i, current = ``1``;` `            ``while` `(parent[p] != -``1``) {` `                ``current++;` `                ``p = parent[p];` `            ``}`   `            ``res = Math.max(res, current);` `        ``}` `        ``return` `res;` `    ``}`   `    ``// Driver program` `    ``static` `public` `void` `main(String[] args)` `    ``{` `        ``int``[] parent = { -``1``, ``0``, ``1``, ``6``, ``6``, ``0``,` `                         ``0``, ``2``, ``7` `};` `        ``int` `n = parent.length;`   `        ``int` `height = findHeight(parent, n);`   `        ``System.out.println(``"Height of the "` `                           ``+ ``"given tree is: "` `+ height);` `    ``}` `}`   `// This code is contributed by vt_m.`

## Python3

 `# Python program to find the height of the generic ` `# tree(n-ary tree) if parent array is given `   `# function to find the height of tree ` `def` `findHeight(parent, n): `   `    ``res ``=` `0`   `    ``# Traverse each node ` `    ``for` `i ``in` `range``(n):             ` `        ``# traverse to parent until -1 ` `        ``# is reached ` `        ``p ``=` `i` `        ``current ``=` `1` `        ``while` `(parent[p] !``=` `-``1``):` `            ``current``+``=` `1` `            ``p ``=` `parent[p] ` `        ``res ``=` `max``(res, current) ` `    ``return` `res `   `    `  `# Driver code` `if` `__name__ ``=``=` `'__main__'``:` `    ``parent ``=` `[``-``1``, ``0``, ``1``, ``6``, ``6``, ``0``, ``0``, ``2``, ``7``]` `    ``n ``=` `len``(parent) ` `    ``height ``=` `findHeight(parent, n) ` `    ``print``(``"Height of the given tree is:"``, height)`   `# This code is contributed by SHUBHAMSINGH10`

## C#

 `// C# program to find the height of` `// the generic tree(n-ary tree) if` `// parent array is given` `using` `System;`   `public` `class` `GFG {`   `    ``// function to find the height of tree` `    ``static` `int` `findHeight(``int``[] parent, ``int` `n)` `    ``{` `        ``int` `res = 0;`   `        ``// Traverse each node` `        ``for` `(``int` `i = 0; i < n; i++) {`   `            ``// traverse to parent until -1` `            ``// is reached` `            ``int` `p = i, current = 1;` `            ``while` `(parent[p] != -1) {` `                ``current++;` `                ``p = parent[p];` `            ``}`   `            ``res = Math.Max(res, current);` `        ``}`   `        ``return` `res;` `    ``}`   `    ``// Driver program` `    ``static` `public` `void` `Main()` `    ``{` `        ``int``[] parent = { -1, 0, 1, 6, 6, 0,` `                         ``0, 2, 7 };` `        ``int` `n = parent.Length;`   `        ``int` `height = findHeight(parent, n);`   `        ``Console.WriteLine(``"Height of the "` `                          ``+ ``"given tree is: "` `+ height);` `    ``}` `}`   `// This code is contributed by vt_m.`

## Javascript

 ``

Output:

`Height of the given tree is: 5`

Time Complexity : O( N^2 )

Space Complexity : O( 1 )

Optimized approach: We use dynamic programming. We store the height from root to each node in an array. So, if we know the height of the root to a node, then we can get the height from the root to the node child by simply adding 1.

Implementation:

## CPP

 `// C++ program to find the height of the generic` `// tree(n-ary tree) if parent array is given` `#include ` `using` `namespace` `std;`   `// function to fill the height vector` `int` `rec(``int` `i, ``int` `parent[], vector<``int``> height)` `{` `    ``// if we have reached root node the ` `    ``// return 1 as height of root node` `    ``if` `(parent[i] == -1) {` `        ``return` `1;` `    ``}` ` `  `    ``// if we have calculated height of a ` `    ``// node then return if` `    ``if` `(height[i] != -1) {` `        ``return` `height[i];` `    ``}`   `    ``// height from root to a node = height ` `    ``// from root to nodes parent + 1` `    ``height[i] = rec(parent[i], parent, height) + 1;` `   `  `    ``// return nodes height` `    ``return` `height[i];` `}`   `// function to find the height of tree` `int` `findHeight(``int``* parent, ``int` `n)` `{` `    ``int` `res = 0;`   `    ``// vector to store heights of all nodes` `    ``vector<``int``> height(n, -1);`   `    ``for` `(``int` `i = 0; i < n; i++) {` `        ``res = max(res, rec(i, parent, height));` `    ``}`   `    ``return` `res;` `}`   `// Driver program` `int` `main()` `{` `    ``int` `parent[] = { -1, 0, 1, 6, 6, 0, 0, 2, 7 };` `    ``int` `n = ``sizeof``(parent) / ``sizeof``(parent[0]);` `    ``int` `height = findHeight(parent, n);` `    ``cout << ``"Height of the given tree is: "` `         ``<< height << endl;` `    ``return` `0;` `}`

## Java

 `// Java program to find the height of the generic` `// tree(n-ary tree) if parent array is given`   `import` `java.io.*;` `import` `java.util.*;`   `class` `GFG {` `    `  `    ``// function to fill the height vector` `    ``static` `int` `rec(``int` `i, ``int` `parent[], ``int``[] height)` `    ``{` `        ``// if we have reached root node the` `    ``// return 1 as height of root node` `    ``if` `(parent[i] == -``1``) {` `        ``return` `1``;` `    ``}` `  `  `    ``// if we have calculated height of a` `    ``// node then return if` `    ``if` `(height[i] != -``1``) {` `        ``return` `height[i];` `    ``}` ` `  `    ``// height from root to a node = height` `    ``// from root to nodes parent + 1` `    ``height[i] = rec(parent[i], parent, height) + ``1``;` `    `  `    ``// return nodes height` `    ``return` `height[i];` `    ``}` `    `  `    `  `    ``// function to find the height of tree` `    ``static` `int` `findHeight(``int``[] parent, ``int` `n)` `    ``{` `        ``int` `res = ``0``;` ` `  `    ``// vector to store heights of all nodes` `    ``int` `height[]=``new` `int``[n];` `    ``Arrays.fill(height,-``1``);` ` `  `    ``for` `(``int` `i = ``0``; i < n; i++) {` `        ``res = Math.max(res, rec(i, parent, height));` `    ``}` ` `  `    ``return` `res;` `    ``}` `    `  `    ``// Driver program` `    `  `    ``public` `static` `void` `main (String[] args) {` `        `  `        ``int``[] parent = { -``1``, ``0``, ``1``, ``6``, ``6``, ``0``, ``0``, ``2``, ``7` `};` `        ``int` `n = parent.length;` `        ``int` `height = findHeight(parent, n);` `        `  `        `  `        ``System.out.println(``"Height of the given tree is: "``+height);` `    ``}` `}`   `// This code is contributed by avanitrachhadiya2155`

## Python3

 `# Python3 program to find the height of the generic` `# tree(n-ary tree) if parent array is given`   `# function to fill the height vector` `def` `rec(i, parent, height):` `  `  `    ``# if we have reached root node the` `    ``# return 1 as height of root node` `    ``if` `(parent[i] ``=``=` `-``1``):` `        ``return` `1`   `    ``# if we have calculated height of a` `    ``# node then return if` `    ``if` `(height[i] !``=` `-``1``):` `        ``return` `height[i]`   `    ``# height from root to a node = height` `    ``# from root to nodes parent + 1` `    ``height[i] ``=` `rec(parent[i], parent, height) ``+` `1`   `    ``# return nodes height` `    ``return` `height[i]`   `# function to find the height of tree` `def` `findHeight(parent, n):` `    ``res ``=` `0`   `    ``# vector to store heights of all nodes` `    ``height ``=` `[``-``1``]``*``(n)`   `    ``for` `i ``in` `range``(n):` `        ``res ``=` `max``(res, rec(i, parent, height))`   `    ``return` `res`   `# Driver program` `if` `__name__ ``=``=` `'__main__'``:` `    ``parent ``=` `[``-``1``, ``0``, ``1``, ``6``, ``6``, ``0``, ``0``, ``2``, ``7``]` `    ``n ``=` `len``(parent)` `    ``height ``=` `findHeight(parent, n)` `    ``print``(``"Height of the given tree is: "``,height)`   `# This code is contributed by mohit kumar 29.`

## C#

 `// C# program to find the height of the generic` `// tree(n-ary tree) if parent array is given` `using` `System;`   `public` `class` `GFG{` `    `  `    ``// function to fill the height vector` `    ``static` `int` `rec(``int` `i, ``int``[] parent, ``int``[] height)` `    ``{` `      `  `        ``// if we have reached root node the` `    ``// return 1 as height of root node` `    ``if` `(parent[i] == -1) {` `        ``return` `1;` `    ``}` `   `  `    ``// if we have calculated height of a` `    ``// node then return if` `    ``if` `(height[i] != -1) {` `        ``return` `height[i];` `    ``}` `  `  `    ``// height from root to a node = height` `    ``// from root to nodes parent + 1` `    ``height[i] = rec(parent[i], parent, height) + 1;` `     `  `    ``// return nodes height` `    ``return` `height[i];` `    ``}` `     `  `     `  `    ``// function to find the height of tree` `    ``static` `int` `findHeight(``int``[] parent, ``int` `n)` `    ``{` `        ``int` `res = 0;` `  `  `    ``// vector to store heights of all nodes` `    ``int``[] height = ``new` `int``[n];` `    ``Array.Fill(height, -1);` `  `  `    ``for` `(``int` `i = 0; i < n; i++) {` `        ``res = Math.Max(res, rec(i, parent, height));` `    ``}` `  `  `    ``return` `res;` `    ``}` `     `  `    ``// Driver program` `    ``static` `public` `void` `Main ()` `    ``{    ` `        ``int``[] parent = { -1, 0, 1, 6, 6, 0, 0, 2, 7 };` `        ``int` `n = parent.Length;` `        ``int` `height = findHeight(parent, n);` `         `  `         `  `        ``Console.WriteLine(``"Height of the given tree is: "``+height);    ` `    ``}` `}`   `// This code is contributed by ab2127`

## Javascript

 ``

Output:

`Height of the given tree is: 5`

Time complexity :- O(n)
Space complexity :- O(n)

This article is contributed by Prakriti Gupta. 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.

My Personal Notes arrow_drop_up
Related Articles