GeeksforGeeks App
Open App
Browser
Continue

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

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