Skip to content
Related Articles

Related Articles

Height of n-ary tree if parent array is given

View Discussion
Improve Article
Save Article
Like Article
  • Difficulty Level : Easy
  • Last Updated : 28 Jun, 2021

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.  

C++




// C++ program to find the height of the generic
// tree(n-ary tree) if parent array is given
#include <bits/stdc++.h>
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




<script>
 
// JavaScript program to find the height of
// the generic tree(n-ary tree) if
// parent array is given
     
    // function to find the height of tree
    function findHeight(parent,n)
    {
        let res = 0;
  
        // Traverse each node
        for (let i = 0; i < n; i++) {
  
            // traverse to parent until -1
            // is reached
            let p = i, current = 1;
            while (parent[p] != -1) {
                current++;
                p = parent[p];
            }
  
            res = Math.max(res, current);
        }
        return res;
    }
     
    // Driver program
    let parent=[-1, 0, 1, 6, 6, 0,
                         0, 2, 7];
     
    let n = parent.length;
  
    let height = findHeight(parent, n);
  
    document.write("Height of the "
                   + "given tree is: " + height);
     
 
 
// This code is contributed by unknown2108
 
</script>


Output: 

Height of the given tree is: 5

 

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. 
 

CPP




// C++ program to find the height of the generic
// tree(n-ary tree) if parent array is given
#include <bits/stdc++.h>
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




<script>
// Javascript program to find the height of the generic
// tree(n-ary tree) if parent array is given
 
// function to fill the height vector
function 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
function findHeight(parent,n)
{
    let res = 0;
  
    // vector to store heights of all nodes
    let height=new Array(n);
    for(let i=0;i<n;i++)
    {
        height[i]=-1;
    }
  
    for (let i = 0; i < n; i++) {
         
        res = Math.max(res, rec(i, parent, height));
    }
     
     
    return res;
}
 
// Driver program
let parent=[-1, 0, 1, 6, 6, 0, 0, 2, 7];
let n=parent.length;
let height = findHeight(parent, n);
document.write("Height of the given tree is: "+height+"<br>");
     
 
// This code is contributed by patel2127
</script>


Output: 

Height of the given tree is: 5

 

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

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
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
Recommended Articles
Page :

Start Your Coding Journey Now!