原题链接:. - 力扣(LeetCode)
分成2步,第1步:利用DFS来计算子树大小。第2步:判断节点是否符合题目要求?即判断儿子子树的大小是否都相同,则该节点是一个好节点。
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 fa) -> int {
// [&]的作用是捕获外部变量,auto&& 是现代 C++ 中处理泛型递归 lambda 的推荐做法。接受左值(lvalue)并将其作为左值引用,接受右值(rvalue)并将其作为右值引用。x是当前节点
int size = 1, sz0 = 0;
bool ok = true;
for (int y : g[x]) {
if (y == fa) {
continue;
}
int sz = dfs(dfs, y, x); // 求树大小,dfs递归,y当前节点为根节点,父节点为x
if (sz0 == 0) { // 如果sz0还是0,即第一个子树
sz0 = sz;
} else if (sz != sz0) { // 如果后面的子树大小不等于第一个子树的大小
ok = false; // ok置为false
}
size += sz; // 求和
}
ans += ok; // 如果是一个好节点,答案+1
return size;
};
dfs(dfs, 0, -1); // 从根节点0开始遍历,-1是不存在的父节点
return ans;
}
};