给定一棵二叉树,我们的任务是从根节点开始打印高度为素数的节点。
例子:
Input:
1
/ \
2 3
/ \
4 5
Output: 4 5
Explanation:
For this tree:
Height of Node 1 - 0,
Height of Node 2 - 1,
Height of Node 3 - 1,
Height of Node 4 - 2,
Height of Node 5 - 2.
Hence, the nodes whose height
is a prime number are 4, and 5.
Input:
1
/ \
2 5
/ \
3 4
Output: 3 4
Explanation:
For this tree:
Height of Node 1 - 0,
Height of Node 2 - 1,
Height of Node 3 - 2,
Height of Node 4 - 2,
Height of Node 5 - 1.
Hence, the nodes whose height
is a prime number are 3, and 4.
方法:为解决上述问题,
- 我们必须在树上执行深度优先搜索(DFS) ,对于每个节点,在我们向下移动树时,存储每个节点的高度。
- 遍历每个节点的高度数组,并检查是否为素数。
- 如果是,则打印该节点,否则忽略它。
下面是上述方法的实现:
C++
// C++ implementation of nodes
// at prime height in the given tree
#include
using namespace std;
#define MAX 100000
vector graph[MAX + 1];
// To store Prime Numbers
vector Prime(MAX + 1, true);
// To store height of each node
int height[MAX + 1];
// Function to find the
// prime numbers till 10^5
void SieveOfEratosthenes()
{
int i, j;
Prime[0] = Prime[1] = false;
for (i = 2; i * i <= MAX; i++) {
// Traverse all multiple of i
// and make it false
if (Prime[i]) {
for (j = 2 * i; j < MAX; j += i) {
Prime[j] = false;
}
}
}
}
// Function to perform dfs
void dfs(int node, int parent, int h)
{
// Store the height of node
height[node] = h;
for (int to : graph[node]) {
if (to == parent)
continue;
dfs(to, node, h + 1);
}
}
// Function to find the nodes
// at prime height
void primeHeightNode(int N)
{
// To precompute prime number till 10^5
SieveOfEratosthenes();
for (int i = 1; i <= N; i++) {
// Check if height[node] is prime
if (Prime[height[i]]) {
cout << i << " ";
}
}
}
// Driver code
int main()
{
// Number of nodes
int N = 5;
// Edges of the tree
graph[1].push_back(2);
graph[1].push_back(3);
graph[2].push_back(4);
graph[2].push_back(5);
dfs(1, 1, 0);
primeHeightNode(N);
return 0;
}
Java
// Java implementation of nodes
// at prime height in the given tree
import java.util.*;
class GFG{
static final int MAX = 100000;
@SuppressWarnings("unchecked")
static Vector []graph = new Vector[MAX + 1];
// To store Prime Numbers
static boolean []Prime = new boolean[MAX + 1];
// To store height of each node
static int []height = new int[MAX + 1];
// Function to find the
// prime numbers till 10^5
static void SieveOfEratosthenes()
{
int i, j;
Prime[0] = Prime[1] = false;
for(i = 2; i * i <= MAX; i++)
{
// Traverse all multiple of i
// and make it false
if (Prime[i])
{
for(j = 2 * i; j < MAX; j += i)
{
Prime[j] = false;
}
}
}
}
// Function to perform dfs
static void dfs(int node, int parent, int h)
{
// Store the height of node
height[node] = h;
for(int to : graph[node])
{
if (to == parent)
continue;
dfs(to, node, h + 1);
}
}
// Function to find the nodes
// at prime height
static void primeHeightNode(int N)
{
// To precompute prime number till 10^5
SieveOfEratosthenes();
for(int i = 1; i <= N; i++)
{
// Check if height[node] is prime
if (Prime[height[i]])
{
System.out.print(i + " ");
}
}
}
// Driver code
public static void main(String[] args)
{
// Number of nodes
int N = 5;
for(int i = 0; i < Prime.length; i++)
Prime[i] = true;
for(int i = 0; i < graph.length; i++)
graph[i] = new Vector();
// Edges of the tree
graph[1].add(2);
graph[1].add(3);
graph[2].add(4);
graph[2].add(5);
dfs(1, 1, 0);
primeHeightNode(N);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 implementation of nodes
# at prime height in the given tree
MAX = 100000
graph = [[] for i in range(MAX + 1)]
# To store Prime Numbers
Prime = [True for i in range(MAX + 1)]
# To store height of each node
height = [0 for i in range(MAX + 1)]
# Function to find the
# prime numbers till 10^5
def SieveOfEratosthenes():
Prime[0] = Prime[1] = False
i = 2
while i * i <= MAX:
# Traverse all multiple of i
# and make it false
if (Prime[i]):
for j in range(2 * i, MAX, i):
Prime[j] = False
i += 1
# Function to perform dfs
def dfs(node, parent, h):
# Store the height of node
height[node] = h
for to in graph[node]:
if (to == parent):
continue
dfs(to, node, h + 1)
# Function to find the nodes
# at prime height
def primeHeightNode(N):
# To precompute prime
# number till 10^5
SieveOfEratosthenes()
for i in range(1, N + 1):
# Check if height[node] is prime
if (Prime[height[i]]):
print(i, end = ' ')
# Driver code
if __name__=="__main__":
# Number of nodes
N = 5
# Edges of the tree
graph[1].append(2)
graph[1].append(3)
graph[2].append(4)
graph[2].append(5)
dfs(1, 1, 0)
primeHeightNode(N)
# This code is contributed by rutvik_56
C#
// C# implementation of nodes
// at prime height in the given tree
using System;
using System.Collections.Generic;
class GFG{
static readonly int MAX = 100000;
static List[] graph = new List[ MAX + 1 ];
// To store Prime Numbers
static bool[] Prime = new bool[MAX + 1];
// To store height of each node
static int[] height = new int[MAX + 1];
// Function to find the
// prime numbers till 10^5
static void SieveOfEratosthenes()
{
int i, j;
Prime[0] = Prime[1] = false;
for (i = 2; i * i <= MAX; i++)
{
// Traverse all multiple of i
// and make it false
if (Prime[i])
{
for (j = 2 * i; j < MAX; j += i)
{
Prime[j] = false;
}
}
}
}
// Function to perform dfs
static void dfs(int node, int parent, int h)
{
// Store the height of node
height[node] = h;
foreach(int to in graph[node])
{
if (to == parent)
continue;
dfs(to, node, h + 1);
}
}
// Function to find the nodes
// at prime height
static void primeHeightNode(int N)
{
// To precompute prime number till 10^5
SieveOfEratosthenes();
for (int i = 1; i <= N; i++)
{
// Check if height[node] is prime
if (Prime[height[i]])
{
Console.Write(i + " ");
}
}
}
// Driver code
public static void Main(String[] args)
{
// Number of nodes
int N = 5;
for (int i = 0; i < Prime.Length; i++)
Prime[i] = true;
for (int i = 0; i < graph.Length; i++)
graph[i] = new List();
// Edges of the tree
graph[1].Add(2);
graph[1].Add(3);
graph[2].Add(4);
graph[2].Add(5);
dfs(1, 1, 0);
primeHeightNode(N);
}
}
// This code is contributed by Amit Katiyar
输出:
4 5