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

目录

1,题目描述

题目大意

输入:

输出:

2,解题思路

关键:

存储结构:

dfs算法实现:

3,代码【C++】


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

  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);
    }
}
发布了45 篇原创文章 · 获赞 5 · 访问量 2197

猜你喜欢

转载自blog.csdn.net/qq_41528502/article/details/104185905