目录
1,题目描述
题目大意
输入:
输出:
2,解题思路
关键:
存储结构:
1,题目描述
Sample Input:
2 1
01 1 02
Sample Output:
0 1
题目大意
将一个家族构成一棵树,依次输出每一层的叶节点个数;
输入:
第一行:n:树中的节点数目;m:没有叶子的节点数目
后m行:ID:两位数字,表示一个无叶子的节点;k:此节点孩子的数目;剩下的为子节点的编号;
输出:
从根节点那层开始,输出每一层的叶节点数目,中间用空格隔开;
2,解题思路
刚开始看到ID是两位数字,而且是01,02,03,04...还在担心这该怎么处理,,,然而后来发现,是我多虑了。。。
原先想用map来实现的,后来发现大神用数组更简单快捷(毕竟PAT不考虑计算时间与占用空间大小是否更高效,只要保证不超时/溢出即可);
关键:
存储结构:
vector<int> tree[100]:
- 由于节点的最大数目有限制(0-100),数据量不是很大,故可以设固定大小的数组,来存储树的结构;
- 由于每个节点的子节点数目未知,故可以考虑容器vector<int>
int num[100]:
- 最多100层,故规模可设为100;
int maxDepth:
- 全局变量,不断更新最大深度;
以上均设为全局变量,可减少函数参数数目;
dfs算法实现:
- 出口条件:叶节点,同时更新最大深度 与 当前层叶节点数目;
- 依次遍历(调用dfs)该节点的每个叶节点;
3,代码【C++】
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
vector<int> tree[100]; //二维数组 存放家族树(100个vector<int>)
int num[100] = {0}; //记录每一层的叶子数
int maxDepth = 1; //记录最大深度
void dfs(int node, int depth);
int main(){
//#ifdef ONLINE_JUDGE
//#else
// freopen("1.txt", "r", stdin);
//#endif
int n, m; //n:节点总数,m:不含叶节点的节点总数
scanf("%d%d", &n, &m);
int id, k, id_;
for(int i = 0; i < m; i++){
scanf("%d%d", &id, &k);
for(int j = 0; j < k; j++){
scanf("%d", &id_);
tree[id].push_back(id_);
}
}
dfs(1, 1); //起始节点从01开始计数;深度起始为1
printf("%d", num[1]);
for(int i = 2; i <= maxDepth; i++){
printf(" %d", num[i]);
}
}
void dfs(int node, int depth){
if(tree[node].size() == 0){ //若为叶节点
num[depth]++;
maxDepth = max(depth, maxDepth);
return;
}
for(int i = 0; i < tree[node].size(); i++){ //遍历所有子节点
dfs(tree[node][i], depth+1);
}
}
标签:1004,PAT,int,Leaves,tree,dfs,100,include,节点 From: https://blog.51cto.com/u_15849465/5801384