PAT甲级1004 Counting Leaves (30分):[C++题解]树、邻接表存储树、dfs遍历树

2023-12-07 12:18

本文主要是介绍PAT甲级1004 Counting Leaves (30分):[C++题解]树、邻接表存储树、dfs遍历树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 题目分析
    • 题目链接

题目分析

在这里插入图片描述

题意重述:一棵树,求每一层的叶子节点数目。

分析 构造树,使用邻接表来存(相当于存储有向图)。

需要一个头结点数组h[N],然后每个头节点往外形成一个单链表e[],ne[];(用数组模拟)单链表中用来存该结点的孩子结点,用cnt[N]数组来记录每一层的叶子结点数。

使用深度优先遍历dfs来求每一层的叶子节点数,由于是邻接表式的存储,头结点数组中某结点值是-1,表示是叶子结点,这也就是dfs的退出的条件,此时如何退出呢? 需要将该叶子结点所在层数的叶子数++,然后记得更新树的最大深度。

然后深度遍历该结点的孩子结点。

ac代码

#include<bits/stdc++.h>
using namespace std;const int N=110;
int n,m;
//用邻接表来存
int h[N], e[N],ne[N], idx; //idx默认初始化为0int cnt[N] ;// 每一层的叶子结点数int max_depth; //树的最大层数void add(int a, int b){ //使用头结点a的链表 h[a]//在a这个单链表内,插入结点b(头插法)//表示a有一个儿子b//e[ ] 存的是结点号b//ne [ ] 中存的是下一个结点序号idx,不是结点号e[idx] =b,ne[idx] =h[a],h[a]=idx++;//cout<< a<<' '<<b<<endl;
}void dfs(int u, int depth){if(h[u]==-1){ //说明u是叶子结点cnt[depth]++;//depth这一层的计数++max_depth=max(max_depth,depth);return;}//遍历头结点u对应的单链表h[u]for(int i =h[u]; i!=-1; i=ne[i]){dfs(e[i],depth+1);//}}int main(){cin>> n>> m;memset(h ,-1,sizeof h);for(int i=0;i<m;i++){int id ,k;cin>> id >> k;while(k--){int son;cin>>son;add(id , son);//构造邻接表}}dfs(1,0);  //结点号,层数cout<<cnt[0];for(int i=1;i<=max_depth;i++) cout<<" "<<cnt[i];}  

题目链接

PAT甲级1004 Counting Leaves (30分)

这篇关于PAT甲级1004 Counting Leaves (30分):[C++题解]树、邻接表存储树、dfs遍历树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465834

相关文章

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)