📜  如果给定父数组,则 n 叉树的高度

📅  最后修改于: 2022-05-13 01:57:16.991000             🧑  作者: Mango

如果给定父数组,则 n 叉树的高度

给定一个父数组 P,其中 P[i] 表示树中第 i 个节点的父节点(假设根节点 id 的父节点用 -1 表示)。求树的高度。

例子:

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. 从每个节点开始,一直到它的父节点,直到我们到达 -1。
2. 另外,跟踪所有节点之间的最大高度。

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


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 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 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


输出:
Height of the given tree is: 5

优化方法
我们使用动态规划。我们将根到每个节点的高度存储在一个数组中。
因此,如果我们知道根到节点的高度,那么我们可以通过简单地加 1 来获得从根到节点子节点的高度。

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 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 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


输出:
Height of the given tree is: 5

时间复杂度:- O(n)
空间复杂度:- O(n)