题解
class Solution {
public:
int countGoodNodes(vector<vector<int>>& edges) {
int n = edges.size() + 1;
vector<vector<int>> g(n);
for (auto& e : edges) {
int x = e[0], y = e[1];
g[x].push_back(y);
g[y].push_back(x);
}
int ans = 0;
auto dfs = [&](auto&& dfs, int x, int p) -> int {
int size = 1, sz0 = 0;
bool ok = true;
for (int y : g[x]) {
if (y == p) {
continue;
}
int sz = dfs(dfs, y, x);
if (sz0 == 0) {
sz0 = sz;
} else if (sz != sz0) {
ok = false;
}
size += sz;
}
ans += ok;
return size;
};
dfs(dfs, 0, -1);
return ans;
}
};
思路
DFS
使用 vector<vector
使用dfs从第一个节点开始遍历,参数x为当前节点,p为父结点防止遍历回父结点。只需要对每个子分支遍历记录节点数即可,只要存在不相同,则标记ok为false,表示该节点子树节点个数不相同。