이 문제에서는 n-ary 트리를 나타내는 인접 목록이 제공됩니다. 우리의 임무는 n-ary 트리에서 짝수 크기의 하위 트리의 수를 찾는 것입니다.
N-ary 트리 은 일반적으로 다음과 같은 방식으로 계층적으로 표현되는 노드 모음으로 정의됩니다.
트리는 루트 노드에서 시작됩니다.
트리의 각 노드는 하위 노드에 대한 포인터 목록을 유지 관리합니다.
하위 노드의 수가 m보다 작거나 같습니다.
문제를 이해하기 위해 예를 들어 보겠습니다.
입력:
<강한>
출력: 4
설명:
뿌리가 7인 나무는 크기가 짝수입니다.
2로 뿌리를 내린 나무는 크기가 짝수입니다.
뿌리가 0인 트리는 크기가 짝수입니다.
뿌리가 3인 나무는 크기가 짝수입니다.
해결 방법 -
간단한 접근 방식은 주어진 노드에 대한 모든 자식 노드를 계산하는 것입니다(eventTreeCount가 증가하더라도). 이를 위해 DFS를 사용하고 주어진 노드에 대한 SubTree의 길이를 찾습니다.
트리에서 단일 순회를 사용하여 이를 수행할 수 있습니다. 재귀적으로 각 자식 노드의 하위 트리 크기를 찾은 다음 크기를 확인하고 짝수이면 eventTreeCount를 늘리고 그렇지 않으면 그대로 둡니다.
우리 솔루션의 작동을 설명하는 프로그램,
예시
#include <bits/stdc++.h> using namespace std; int countEventSizeSubTree(vector<int> adj[], int n, int v, int& EvenCount){ int size = 1; for (auto ele : adj[v]) { size += countEventSizeSubTree(adj, n, ele, EvenCount); } if (size % 2 == 0) EvenCount++; return size; } int main(){ int n; n = 10; vector<int> adj[n + 1]; adj[7].push_back(2); adj[7].push_back(9); adj[2].push_back(0); adj[2].push_back(1); adj[9].push_back(3); adj[3].push_back(8); adj[0].push_back(5); int EvenCount = 0; countEventSizeSubTree(adj, n, 1, EvenCount); cout<<"Even Size SubTree are "<<EvenCount; return 0; }
출력 -
Even Size SubTree are 0