相似的兄弟 本节内容计 100 分,至少得 100 分可通过 反馈 我要提问 1000ms 131072K 有一无向连通图 GG(nn 个顶点,n - 1n−1 条边,点从 11 到 nn 依次编号)。当然,你能看出这其实就是一棵树,请找出所有满足以下条件的节点: 该节点不是叶子节点(度不为 00)。 该节点下面所有的子树大小必须相同(如果下面只有一棵子树也默认为相同)。 注意,该树为有根树,你需要先找到它的根才能开始访问其他节点。 请你设计程序,完成上面要求。 输入格式 第一行包含 11 个整数 nn。 接下来 n-1n−1 行,每行包含 22 个用空格隔开的正整数 uu、vv,表示编号为 uu 和编号为 vv 的点之间有边相连,其中 uu 是 vv 的父亲节点。
时间: 2023-02-07 19:03:06 浏览: 145
这道题目的意思是,给定一棵树,要求找出所有满足以下两个条件的节点:
1. 该节点不是叶子节点(度不为0)。
2. 该节点下面所有的子树大小必须相同(如果下面只有一棵子树也默认为相同)。
为了解决这个问题,我们可以使用一种称为递归的算法。我们从根节点开始,递归遍历整棵树,对于每一个节点,我们先判断它是否为叶子节点,如果是,则跳过;如果不是,则遍历它的每一个子节点,统计它们的子树大小,并判断是否相等。如果相等,则将该节点加入结果集;如果不相等,则跳过该节点。
下面是一个简单的递归算法的代码实现:
```
void findNodes(Node* root, vector<int>& res) {
// 如果当前节点是叶子节点,则跳过
if (root->children.empty()) return;
bool equal = true;
int size = root->children[0]->size;
// 遍历当前节点的每一个子节点
for (int i = 1; i < root->children.size(); i++) {
// 如果有子树大小不相等,则退出循环
if (root->children[i]->size != size) {
equal = false;
break;
}
}
// 如果所有子树大小相
阅读全文