Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

จำนวนโหนดใบใน Subtree ของทุกโหนดใน N-ary Tree ใน C++


ให้ N-ary tree หาจำนวนโหนดใบ (leaf nodes) ใน subtree ของทุกโหนด

ตัวอย่าง:

Input: N = 8, tree = [[2,3], [], [4,5,6], [7,8], [], [], [], []]
Output: 1->5 2->1 3->4 4->2 5->1 6->1 7->1 8->1

อัลกอริทึม

  • สร้าง tree adjacency list
  • DFS จากโหนด 1
  • leaf[node] = 0, visited[node] = 1
  • วนลูปลูก: ถ้ายังไม่ visited DFS(l) แล้ว leaf[node] += leaf[l]
  • ถ้าไม่มีลูก leaf[node] = 1
  • พิมพ์ leaf ของทุกโหนด

การเขียนโปรแกรม C++

#include <bits/stdc++.h> using namespace std; void insertNode(int x, int y, vector<int> tree[]) {    tree[x].push_back(y); } void DFS(int node, int leaf[], int visited[], vector<int> tree[]) {    leaf[node] = 0;    visited[node] = 1;    for (auto it : tree[node]) {       if (!visited[it]) {          DFS(it, leaf, visited, tree);          leaf[node] += leaf[it];       }    }    if (!tree[node].size()) leaf[node] = 1; } int main() {    int N = 8;    vector<int> tree[N + 1];    insertNode(1, 2, tree); insertNode(1, 3, tree); insertNode(3, 4, tree); insertNode(3, 5, tree); insertNode(3, 6, tree); insertNode(4, 7, tree); insertNode(4, 8, tree);    int leaf[N + 1];    int visited[N + 1];    for (int i = 0; i <= N; i++) visited[i] = 0;    DFS(1, leaf, visited, tree);    for (int i = 1; i <= N; i++) cout << i << "->" << leaf[i] << endl;    return 0; }

ผลลัพธ์

1->5 2->1 3->4 4->2 5->1 6->1 7->1 8->1