首页 > 编程语言 >PAT_甲级_1004 Counting Leaves (30分) (C++)

PAT_甲级_1004 Counting Leaves (30分) (C++)

时间:2022-10-27 16:03:18浏览次数:51  
标签:1004 PAT int Leaves tree dfs 100 include 节点


目录

​1,题目描述​

​题目大意​

​输入:​

​输出:​

​2,解题思路​

​关键:​

​存储结构:​

​dfs算法实现:​

​3,代码【C++】​


1,题目描述

PAT_甲级_1004 Counting Leaves (30分) (C++)_PAT

 

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算法实现:

  1. 出口条件:叶节点,同时更新最大深度 与 当前层叶节点数目;
  2. 依次遍历(调用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

相关文章