如果给定父数组,则 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)