3249. Count the Number of Good Nodes
Problem Statement
There is an undirected tree with n nodes labeled from 0 to n - 1, and rooted at node 0. You are given a 2D integer array edges of length n - 1, where edges[i] = [ai, bi] indicates that there is an edge between nodes ai and bi in the tree.
A node is good if all the
subtrees rooted at its children have the same size.
Return the number of good nodes in the given tree.
A subtree of treeName is a tree consisting of a node in treeName and all of its descendants.
Example 1:
Input: edges = [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6]]
Output: 7
Explanation:

All of the nodes of the given tree are good.
Example 2:
Input: edges = [[0,1],[1,2],[2,3],[3,4],[0,5],[1,6],[2,7],[3,8]]
Output: 6
Explanation:

There are 6 good nodes in the given tree. They are colored in the image above.
Example 3:
Input: edges = [[0,1],[1,2],[1,3],[1,4],[0,5],[5,6],[6,7],[7,8],[0,9],[9,10],[9,12],[10,11]]
Output: 12
Explanation:

All nodes except node 9 are good.
Constraints:
2 <= n <= 105edges.length == n - 1edges[i].length == 20 <= ai, bi < nThe input is generated such that
edgesrepresents a valid tree.
Intuition
Here,
1) Size is asked so number of nodes in Subtree
2) UNDIRECTED Tree mentioned so
This means [x->y] and [y->x] can both be given in any order so Push_back in both
Other is standard DFS
Links
https://leetcode.com/problems/count-the-number-of-good-nodes/
Video Links
https://www.youtube.com/watch?v=DimYkgJUiL0
Approach 1:
/*
Two words:
Undirected Tree
Size = no of nodes
*/
class Solution {
public:
vector<vector<int>> arr;
int ans = 0;
int find_ans(int node, int parent){
int initial_size = -1;
bool flag = true;
int total = 0;
for(auto &neigh: arr[node]){
if(neigh == parent)
continue;
int size = find_ans(neigh, node);
if(initial_size == -1){
initial_size = size;
}
if(size != initial_size){
flag = false;
}
total += size;
}
if(flag)
ans ++;
return total+1;
// Returning total nodes + root(1)
}
int countGoodNodes(vector<vector<int>>& edges) {
int n = edges.size()+1;
arr.resize(n);
for(auto &it: edges){
int x = it[0], y = it[1];
arr[x].push_back(y);
arr[y].push_back(x);
}
find_ans(0, -1);
return ans;
}
};Approach 2:
Approach 3:
Approach 4:
Similar Problems
Last updated