N叉樹中最大層級和


N叉樹是一種樹形資料結構,其中每個節點最多可以有N個子節點,其中N是一個正整數(N >= 0)。N叉樹在許多應用中使用,例如檔案系統、組織結構圖和程式語言中的語法樹。

N=4的N叉樹示例。

          A
      /  /  \  \
     B   C   D   E
   / | \     |   | \
  F  G  H    I   J  K
        |    |
        L    M

問題陳述

給定一棵具有N個節點的樹,節點編號從0到N-1,以及一個包含每個節點值的陣列A[],即A[i]表示第i個節點的值。節點之間的關係由一個二維陣列edges[][]給出。任務是找到樹的最大層級和。

示例1

輸入

N = 8
A[] = {1, 7, 8, 9, 5, 2, 3, 4}
edges[][] = {{0, 1}, {0, 2}, {0, 3}, {2, 4}, {3, 5}, {5, 6}, {5, 7}}

輸出

24

解釋

  • 第0層的和:1

  • 第1層的和:7+8+9 = 24

  • 第2層的和:5+2 = 7

  • 第3層的和:3+4 = 7

  • 最大和為24,即第1層。

示例2

輸入

N = 3
A[] = {1, 3, 2}
edges[][] = {{0, 1}, {1, 2}}

輸出

3

解釋

  • 第0層的和:1

  • 第1層的和:3

  • 第2層的和:1

  • 最大和為3,即第1層。

解決方案方法

可以透過對樹進行層序遍歷,並存儲每一層的和,最後選擇最大和並確定具有最大和的層級來解決該問題。

虛擬碼

function maximumLevelSum(N, edges, A):
   adj[N]
   for i from 0 to (N - 1):
      adj[edges[i][0]].push_back(edges[i][1])
   maxLevelSum = A[0]
   queue q
   q.push(0)
   while q is not empty:
      count = q.size()
      sum = 0
      while count > 0:
         node = q.front()
         q.pop()
         sum += A[node]
         for i from 0 to size of adj[node]:
            q.push(adj[node][i])
         count = count - 1
      maxLevelSum = max(maxLevelSum, sum)
   return maxLevelSum

示例:C++實現

以下程式對N叉樹進行層序遍歷以獲取最大層級和。

#include <bits/stdc++.h>
using namespace std;

// Function to find the maximum level sum in N-ary tree
int maximumLevelSum(int N, int edges[][2], vector<int> A){
   // Creating the adjacency list representation for the tree
   vector<int> adj[N];
   for (int i = 0; i < (N - 1); i++){
      adj[edges[i][0]].push_back(edges[i][1]);
   }
   // Initialize the maximum level sum as the val[0] which is the level sum for level 0
   int maxLevelSum = A[0];
   // Creating a queue to store the nodes of each level for performing the level order traversal
   queue<int> q;
   q.push(0);
   // level order traversal
   while (!q.empty()){
      int count = q.size();
      int sum = 0;
      while (count--) {
         int node = q.front();
         q.pop();
         sum += A[node];
         for (int i = 0; i < adj[node].size(); i++) {
            q.push(adj[node][i]);
         }
      }
      // Update maximum level sum
      maxLevelSum = max(maxLevelSum, sum);
   }
   // Return the maximum level order sum
   return maxLevelSum;
}
int main(){
   int N = 8;
   int edges[][2] = {{0, 1}, {0, 2}, {0, 3}, {2, 4}, {3, 5}, {5, 6}, {5, 7}};
   vector<int> A = {1, 7, 8, 9, 5, 2, 3, 4};
   cout << maximumLevelSum(N, edges, A);
   return 0;
}

輸出

24

結論

總之,N叉樹是一種樹形資料結構,其中每個節點最多可以有N個子節點。給定的C++程式碼展示瞭如何在N叉樹中找到最大層級和。它使用鄰接表表示樹,並使用佇列執行層序遍歷。最大層級和會被更新,最終結果以O(N)的時間複雜度返回。

更新於: 2023年11月3日

322 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告