「PAT甲级真题解析」Advanced Level 1004 Counting Leaves

news/2024/7/20 20:03:41 标签: 深度优先, 算法, 数据结构, pat考试, 需求分析

PAT (Advanced Level) Practice 1004 Counting Leaves

问题分析

  1. 题设要求按照从根结点开始自顶向下输出树结构每一层的叶子结点数目。
  2. 这意味着我们需要设置计数器, 然后遍历树的每一个结点, 然后检查该结点是否是叶子结点,
    如果是叶子结点, 则将计数器中该层次叶子结点个数+1.
  3. 遍历树结构叶子结点可以用深度优先dfs搜索和广度优先搜索bfs.

完整步骤描述

  1. 获取输入: 树结点总个数, 非叶子结点个数
  2. 初始化记录器:
    • 各个结点的子节点组成记录器
    • 每层叶子结点个数记录器 = {0}
    • 最大层次 = 0
  3. 获取每一个非叶子结点的所有子节点:
    • 获取输入: 非叶子结点的ID, 其子节点个数, 各个子节点ID(记录到记录器中)
  4. 从根结点开始进行深度优先遍历或广度优先遍历(以下使用深度优先遍历):
    • 检查子节点组成记录器中, 该结点是否有子节点:
      • 如果没有, 则该结点为叶子结点:
        • 该层次叶子结点计数+1
        • 检查当前层次是否大于已记录的最大层次, 如果大于则更新记录的最大层次
    • 如果不是叶子结点, 则遍历每一个子节点, 递归进行上述检查
  5. 遍历完毕后, 输出记录的从顶层到最大层次的各个层次叶子结点数目.

伪代码描述

  1. get input: total_node_amount, non_left_node_amount
  2. init recorder/counter:
    • node_to_its_children = []
    • left_node_of_layer = {0}
    • max_depth = 0
  3. for i in range(0, total_node_amount):
    • get input: node_ID, children_amount:
      • for j in range(0, children_amount):
        • get input: child_ID
        • push child_ID into node_to_its_children[node_ID]
  4. dfs(index=1, depth=0):
    • if node_to_its_children[index].size() == 0:
      • left_node_of_layer[depth]++;
      • max_depth = max(max_depth, depth);
      • return;
    • else:
      • for child in node_to_its_children[index]:
        • dfs(child’s index, depth+1);
  5. for depth in range(0, max_depth):
    • print(node_to_its_children[depth]);

完整提交代码

/*
# 问题分析
1. 题设要求按照从根结点开始自顶向下输出树结构每一层的叶子结点数目。
2. 这意味着我们需要设置计数器, 然后遍历树的每一个结点, 然后检查该结点是否是叶子结点,
如果是叶子结点, 则将计数器中该层次叶子结点个数+1.
3. 遍历树结构叶子结点可以用深度优先dfs搜索和广度优先搜索bfs.

# 完整步骤描述
1. 获取输入: 树结点总个数, 非叶子结点个数
2. 初始化记录器:
    - 各个结点的子节点组成记录器
    - 每层叶子结点个数记录器 = {0}
    - 最大层次 = 0
3. 获取每一个非叶子结点的所有子节点:
    - 获取输入: 非叶子结点的ID, 其子节点个数, 各个子节点ID(记录到记录器中)
4. 从根结点开始进行深度优先遍历或广度优先遍历(以下使用深度优先遍历):
    - 检查子节点组成记录器中, 该结点是否有子节点:
        - 如果没有, 则该结点为叶子结点:
            - 该层次叶子结点计数+1
            - 检查当前层次是否大于已记录的最大层次, 如果大于则更新记录的最大层次
    - 如果不是叶子结点, 则遍历每一个子节点, 递归进行上述检查
5. 遍历完毕后, 输出记录的从顶层到最大层次的各个层次叶子结点数目.

# 伪代码描述
1. get input: total_node_amount, non_left_node_amount
2. init recorder/counter:
    - node_to_its_children = []
    - left_node_of_layer = {0}
    - max_depth = 0
3. for i in range(0, total_node_amount):
    - get input: node_ID, children_amount:
        - for j in range(0, children_amount):
            - get input: child_ID
            - push child_ID into node_to_its_children[node_ID]
4. dfs(index=1, depth=0):
    - if node_to_its_children[index].size() == 0:
        - left_node_of_layer[depth]++;
        - max_depth = max(max_depth, depth);
        - return;
    - else:
        - for child in node_to_its_children[index]:
            - dfs(child's index, depth+1);
5. for depth in range(0, max_depth):
    - print(node_to_its_children[depth]);
*/


# include<iostream>
# include<vector>
using namespace std;

vector<int> node_to_its_children[101];
int left_node_of_layer[101] = {0};
int max_depth = 0;

void dfs(int index, int depth){
    if (node_to_its_children[index].size() == 0){
        left_node_of_layer[depth]++;
        max_depth = max(depth, max_depth);
        return ;
    }
    for (int i = 0; i < node_to_its_children[index].size(); i++){
        dfs(node_to_its_children[index][i], depth+1);
    }
}


int main(){
    int total_node_amount, non_left_node_amount;
    scanf("%d %d", &total_node_amount, &non_left_node_amount);
    int node_ID, children_amount, child_ID;
    for (int i = 0; i < non_left_node_amount; i++){
        scanf("%d %d", &node_ID, &children_amount);
        for (int j = 0; j < children_amount; j++){
            scanf("%d", &child_ID);
            node_to_its_children[node_ID].push_back(child_ID);
        }
    }

    dfs(1, 0);
    printf("%d", left_node_of_layer[0]);
    for (int i = 1; i <= max_depth; i++){
        printf(" %d", left_node_of_layer[i]);
    }

    return 0;
}


http://www.niftyadmin.cn/n/1328.html

相关文章

【动态规划之完全背包问题】如何将完全背包运用到实际问题,强化完全背包以及一维优化的推导

⭐️前面的话⭐️ 本篇文章将介绍动态规划中的背包问题——完全背包问题&#xff0c;前面我们已经介绍了什么是完全背包问题以及对应的解决方案&#xff0c;本文将列举一道实际问题来强化对完全背包的解题以及优化思维。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页…

Hudi Java Client总结|读取Hive写Hudi代码示例

前言 Hudi除了支持Spark、Fink写Hudi外&#xff0c;还支持Java客户端。本文总结Hudi Java Client如何使用&#xff0c;主要为代码示例&#xff0c;可以实现读取Hive表写Hudi表。当然也支持读取其他数据源&#xff0c;比如mysql&#xff0c;实现读取mysql的历史数据和增量数据写…

【网络工程师笔记】——ACL

ACL 访问控制列表&#xff08;Access Control List,ACL&#xff09;是目前使用最多的访问控制实现技术。 访问控制列表是路由器接口的指令列表&#xff0c;用来控制端口进出的数据包。 ACL适用于所有的被路由协议&#xff0c;如IP、IPX、AppleTalk等。访问控制列表可以分为基本…

C++内存管理和模板

目录 内存管理 new T[N] new和delete关键字的总结&#xff1a; 定位new表达式(placement-new)&#xff1a; 作用&#xff1a; 使用格式&#xff1a; 使用场景&#xff1a; 实例&#xff1a; 调用析构函数的两个方法&#xff1a; 池化技术&#xff1a; 面试题&#xff1…

基于OFDM+STBC通信链路的误码率matlab仿真

目录 1.算法概述 2.部分程序 3.算法部分仿真结果图 4.完整程序获取 CSDN用户&#xff1a;我爱C编程 CSDN主页&#xff1a;https://blog.csdn.net/hlayumi1234567?typeblog 擅长技术&#xff1a;智能优化&#xff0c;路径规划&#xff0c;通信信号&#xff0c;图像处理&…

【饭谈】细嗦那些职场中喜欢用领导口气命令别人的同事

又一个粉丝哭了&#xff0c;这已经是最近金九银十开始后短短十天的 第四起眼泪事件了。 为什么哭呢&#xff1f;因为遇到了传说中的 “精神主人翁” 同事 。 是的&#xff0c;就是那种感觉‘自己是主人翁&#xff0c;但是别人是奴隶’的 假无私真利己的人。 同样的职级&…

监控服务器体系

目录 一、常用监控简介 1.cacti 2.Nagios 3.Zabbix 4.Prometheus 二、运维监控平台设计 三、prometheus监控体系 四、Prometheus简介 1.Prometheus特点 2.使用场景 3.不适合的场景 五、prometheus时序数据 1.数据来源 2.收集数据 3.prometheus(获取方式) 六、…

JavaScript中的闭包

目录1. 什么是闭包2. 闭包的用途3. 闭包的应用场景防抖&#xff08;debounce&#xff09;节流&#xff08;throttle&#xff09;4. 使用闭包的注意事项1. 什么是闭包 在理解闭包的概念之前&#xff0c;要先知道JS中的变量作用域&#xff0c;分为全局变量和局部变量两种。特点是…