📌  相关文章
📜  在N元树中使用DFS的最大节点数级别

📅  最后修改于: 2021-06-26 18:19:23             🧑  作者: Mango

给定一个N元树,任务是打印具有最大数量节点的关卡。

例子:

Input : For example, consider the following tree
          1               - Level 1
       /     \
      2       3           - Level 2
    /   \       \
   4     5       6        - Level 3
        /  \     /
       7    8   9         - Level 4


Output : Level-3 and Level-4

方法:

  • 将所有连接节点插入二维矢量树。
  • 在树上运行DFS,以使height [node] = 1 + height [parent]
  • 一旦完成DFS遍历,对于每个节点的级别,将count []数组增加1。
  • 第一个级别迭代到最后一个级别,并找到具有最大节点数的级别。
  • 从第一级到最后一级重新遍历,并打印具有相同最大节点数的所有级别。

下面是上述方法的实现。

C++
// C++ program to print the level
// with maximum number of nodes
  
#include 
using namespace std;
  
// Function for DFS in a tree
void dfs(int node, int parent, int height[], int vis[],
         vector tree[])
{
    // calculate the level of every node
    height[node] = 1 + height[parent];
  
    // mark every node as visited
    vis[node] = 1;
  
    // iterate in the subtree
    for (auto it : tree[node]) {
  
        // if the node is not visited
        if (!vis[it]) {
  
            // call the dfs function
            dfs(it, node, height, vis, tree);
        }
    }
}
  
// Function to insert edges
void insertEdges(int x, int y, vector tree[])
{
    tree[x].push_back(y);
    tree[y].push_back(x);
}
  
// Function to print all levels
void printLevelswithMaximumNodes(int N, int vis[], int height[])
{
    int mark[N + 1];
    memset(mark, 0, sizeof mark);
  
    int maxLevel = 0;
    for (int i = 1; i <= N; i++) {
  
        // count number of nodes
        // in every level
        if (vis[i])
            mark[height[i]]++;
  
        // find the maximum height of tree
        maxLevel = max(height[i], maxLevel);
    }
  
    int maxi = 0;
  
    for (int i = 1; i <= maxLevel; i++) {
        maxi = max(mark[i], maxi);
    }
  
    // print even number of nodes
    cout << "The levels with maximum number of nodes are: ";
    for (int i = 1; i <= maxLevel; i++) {
        if (mark[i] == maxi)
            cout << i << " ";
    }
}
  
// Driver Code
int main()
{
    // Construct the tree
  
    /* 1 
     /  \ 
    2    3 
    / \   \ 
   4   5   6 
      / \  / 
     7   8 9  */
  
    const int N = 9;
  
    vector tree[N + 1];
  
    insertEdges(1, 2, tree);
    insertEdges(1, 3, tree);
    insertEdges(2, 4, tree);
    insertEdges(2, 5, tree);
    insertEdges(5, 7, tree);
    insertEdges(5, 8, tree);
    insertEdges(3, 6, tree);
    insertEdges(6, 9, tree);
  
    int height[N + 1];
    int vis[N + 1] = { 0 };
  
    height[0] = 0;
  
    // call the dfs function
    dfs(1, 0, height, vis, tree);
  
    // Function to print
    printLevelswithMaximumNodes(N, vis, height);
  
    return 0;
}


Java
// Java program to print the level 
// with maximum number of nodes 
import java.util.*;
  
class GFG
{ 
    static int N = 9;
  
// Function for DFS in a tree 
static void dfs(int node, int parent, int height[], int vis[], 
        Vector tree[]) 
{ 
    // calculate the level of every node 
    height[node] = 1 + height[parent]; 
  
    // mark every node as visited 
    vis[node] = 1; 
  
    // iterate in the subtree 
    for (int it : tree[node]) 
    { 
  
        // if the node is not visited 
        if (vis[it] != 1) 
        { 
  
            // call the dfs function 
            dfs(it, node, height, vis, tree); 
        } 
    } 
} 
  
// Function to insert edges 
static void insertEdges(int x, int y, Vector tree[]) 
{ 
    tree[x].add(y); 
    tree[y].add(x); 
} 
  
// Function to print all levels 
static void printLevelswithMaximumNodes(int N, int vis[], int height[]) 
{ 
    int []mark = new int[N + 1]; 
  
    int maxLevel = 0; 
    for (int i = 1; i <= N; i++) { 
  
        // count number of nodes 
        // in every level 
        if (vis[i] == 1) 
            mark[height[i]]++; 
  
        // find the maximum height of tree 
        maxLevel = Math.max(height[i], maxLevel); 
    } 
  
    int maxi = 0; 
  
    for (int i = 1; i <= maxLevel; i++) 
    { 
        maxi = Math.max(mark[i], maxi); 
    } 
  
    // print even number of nodes 
    System.out.print("The levels with maximum number of nodes are: "); 
    for (int i = 1; i <= maxLevel; i++)
    { 
        if (mark[i] == maxi) 
            System.out.print(i+ " "); 
    } 
} 
  
// Driver Code 
public static void main(String[] args) 
{ 
    // Conthe tree 
  
    /* 1 
    / \ 
    2 3 
    / \ \ 
4 5 6 
    / \ / 
    7 8 9 */
  
      
  
    Vector []tree = new Vector[N + 1]; 
    for(int i= 0; i < N + 1; i++)
        tree[i] = new Vector();
    insertEdges(1, 2, tree); 
    insertEdges(1, 3, tree); 
    insertEdges(2, 4, tree); 
    insertEdges(2, 5, tree); 
    insertEdges(5, 7, tree); 
    insertEdges(5, 8, tree); 
    insertEdges(3, 6, tree); 
    insertEdges(6, 9, tree); 
  
    int height[] = new int[N + 1]; 
    int vis[] = new int[N + 1]; 
  
    height[0] = 0; 
  
    // call the dfs function 
    dfs(1, 0, height, vis, tree); 
  
    // Function to print 
    printLevelswithMaximumNodes(N, vis, height); 
  
} 
} 
  
// This code is contributed by 29AjayKumar


Python3
# Python3 program to print the level 
# with the maximum number of nodes 
  
# Function for DFS in a tree 
def dfs(node, parent, height, vis, tree): 
  
    # calculate the level of every node 
    height[node] = 1 + height[parent] 
  
    # mark every node as visited 
    vis[node] = 1
  
    # iterate in the subtree 
    for it in tree[node]: 
  
        # if the node is not visited 
        if vis[it] == 0: 
  
            # call the dfs function 
            dfs(it, node, height, vis, tree) 
          
# Function to insert edges 
def insertEdges(x, y, tree): 
  
    tree[x].append(y) 
    tree[y].append(x) 
  
# Function to print all levels 
def printLevelswithMaximumNodes(N, vis, height): 
  
    mark = [0] * (N + 1) 
  
    maxLevel = 0
    for i in range (1, N + 1): 
  
        # count number of nodes 
        # in every level 
        if vis[i] == 1: 
            mark[height[i]] += 1
  
        # find the maximum height of tree 
        maxLevel = max(height[i], maxLevel) 
      
    maxi = 0
  
    for i in range(1, maxLevel + 1): 
        maxi = max(mark[i], maxi) 
      
    # print even number of nodes 
    print("The levels with maximum number", 
                "of nodes are:", end = " ") 
    for i in range(1, maxLevel + 1): 
        if mark[i] == maxi: 
            print(i, end = " ") 
  
# Driver Code
if __name__ == "__main__":
      
    # Construct the tree 
    N = 9
  
    # Create an empty 2-D list
    tree = [[] for i in range(N + 1)]
  
    insertEdges(1, 2, tree) 
    insertEdges(1, 3, tree) 
    insertEdges(2, 4, tree) 
    insertEdges(2, 5, tree) 
    insertEdges(5, 7, tree) 
    insertEdges(5, 8, tree) 
    insertEdges(3, 6, tree) 
    insertEdges(6, 9, tree) 
  
    height = [None] * (N + 1) 
    vis = [0] * (N + 1) 
  
    height[0] = 0
  
    # call the dfs function 
    dfs(1, 0, height, vis, tree) 
  
    # Function to print 
    printLevelswithMaximumNodes(N, vis, height) 
      
# This code is contributed 
# by Rituraj Jain


C#
// C# program to print the level 
// with maximum number of nodes 
using System;
using System.Collections.Generic;
  
public class GFG
{ 
    static int N = 9;
   
// Function for DFS in a tree 
static void dfs(int node, int parent, int []height, int []vis, 
        List []tree) 
{ 
    // calculate the level of every node 
    height[node] = 1 + height[parent]; 
   
    // mark every node as visited 
    vis[node] = 1; 
   
    // iterate in the subtree 
    foreach (int it in tree[node]) 
    { 
   
        // if the node is not visited 
        if (vis[it] != 1) 
        { 
   
            // call the dfs function 
            dfs(it, node, height, vis, tree); 
        } 
    } 
} 
   
// Function to insert edges 
static void insertEdges(int x, int y, List []tree) 
{ 
    tree[x].Add(y); 
    tree[y].Add(x); 
} 
   
// Function to print all levels 
static void printLevelswithMaximumNodes(int N, int []vis, int []height) 
{ 
    int []mark = new int[N + 1]; 
   
    int maxLevel = 0; 
    for (int i = 1; i <= N; i++) { 
   
        // count number of nodes 
        // in every level 
        if (vis[i] == 1) 
            mark[height[i]]++; 
   
        // find the maximum height of tree 
        maxLevel = Math.Max(height[i], maxLevel); 
    } 
   
    int maxi = 0; 
   
    for (int i = 1; i <= maxLevel; i++) 
    { 
        maxi = Math.Max(mark[i], maxi); 
    } 
   
    // print even number of nodes 
    Console.Write("The levels with maximum number of nodes are: "); 
    for (int i = 1; i <= maxLevel; i++)
    { 
        if (mark[i] == maxi) 
            Console.Write(i+ " "); 
    } 
} 
   
// Driver Code 
public static void Main(String[] args) 
{ 
    // Conthe tree 
   
    /* 1 
    / \ 
    2 3 
    / \ \ 
4 5 6 
    / \ / 
    7 8 9 */
   
       
   
    List []tree = new List[N + 1]; 
    for(int i= 0; i < N + 1; i++)
        tree[i] = new List();
    insertEdges(1, 2, tree); 
    insertEdges(1, 3, tree); 
    insertEdges(2, 4, tree); 
    insertEdges(2, 5, tree); 
    insertEdges(5, 7, tree); 
    insertEdges(5, 8, tree); 
    insertEdges(3, 6, tree); 
    insertEdges(6, 9, tree); 
   
    int []height = new int[N + 1]; 
    int []vis = new int[N + 1]; 
   
    height[0] = 0; 
   
    // call the dfs function 
    dfs(1, 0, height, vis, tree); 
   
    // Function to print 
    printLevelswithMaximumNodes(N, vis, height); 
   
} 
} 
   
  
// This code contributed by Rajput-Ji


输出:
The levels with maximum number of nodes are: 3 4

时间复杂度:O(N)
辅助空间:O(N)

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。