📜  打印高度为素数的二叉树的节点

📅  最后修改于: 2021-04-23 16:53:30             🧑  作者: Mango

给定一棵二叉树,我们的任务是从根节点开始打印高度为素数的节点。

例子:

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.

方法:为解决上述问题,

  1. 我们必须在树上执行深度优先搜索(DFS) ,对于每个节点,在我们向下移动树时,存储每个节点的高度。
  2. 遍历每个节点的高度数组,并检查是否为素数。
  3. 如果是,则打印该节点,否则忽略它。

下面是上述方法的实现:

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