PAT(Advanced Level) 1004 Counting Leaves 解题报告
2013-10-21 16:12
429 查看
题目链接http://pat.zju.edu.cn/contests/pat-a-practise/1004
本题要求计算输出给定的树中各深度的叶节点个数。有两种思路可以解决该问题:
Solution 1: 使用树的层序遍历;
Solution 2: 使用图的DFS(树本身就是一种特殊的图,所以DFS也是适用的)。
比较一下,第二种思路的代码貌似更简洁。
下面给出笔者的C++实现代码:
Solution 1 层序遍历
Solution 2 DFS
本题要求计算输出给定的树中各深度的叶节点个数。有两种思路可以解决该问题:
Solution 1: 使用树的层序遍历;
Solution 2: 使用图的DFS(树本身就是一种特殊的图,所以DFS也是适用的)。
比较一下,第二种思路的代码貌似更简洁。
下面给出笔者的C++实现代码:
Solution 1 层序遍历
#include<iostream> #include<vector> #include<queue> using namespace std; vector<int> tree[101]; int num[101]; struct node { int id,level; //level是一个辅助变量,用于标记当前树节点在树中的深度 node(int _id, int _level=0):id(_id),level(_level) {} }; queue<node> q; int main() { int n,m; cin>>n>>m; for(int i=0;i<m;i++) { int id,k; cin>>id>>k; while(k--) { int temp; cin>>temp; tree[id].push_back(temp); } } q.push(node(1,0)); int max_level=0; while(!q.empty()) { node cur=q.front(); q.pop(); max_level=cur.level; if(tree[cur.id].size()!=0) { for(int j=0;j<tree[cur.id].size();j++) { node nd(tree[cur.id][j],cur.level+1); q.push(nd); } } else num[cur.level]++; } cout<<num[0]; for(int i=1;i<=max_level;i++) cout<<" "<<num[i]; cout<<endl; //system("pause"); return 0; }
Solution 2 DFS
#include<iostream> #include<vector> using namespace std; vector<int> graph[101]; int num[101]; //记录各个深度中叶节点的个数(根节点深度为0) int maxlevel; //记录数的最大深度(全局变量会自动初始化为0) bool visited[101]; //标记树中的节点是否被访问过(会自动初始化为false) void dfs(int vertex, int cur_level, int& max_level) { max_level=cur_level>max_level?cur_level:max_level; visited[vertex]=true; if(graph[vertex].size()!=0) { for(int i=0;i<graph[vertex].size();i++) if(!visited[ graph[vertex][i] ] ) dfs(graph[vertex][i], cur_level+1,max_level); } else num[cur_level]++; } int main() { int n,m; cin>>n>>m; for(int i=0;i<m;i++) { int id,k; cin>>id>>k; while(k--) { int temp; cin>>temp; graph[id].push_back(temp); } } dfs(1,0,maxlevel); cout<<num[0]; for(int i=1;i<=maxlevel;i++) cout<<" "<<num[i]; cout<<endl; //system("pause"); return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- C#数据结构与算法揭秘二
- 浅析STL中的常用算法
- JavaScript 组件之旅(二)编码实现和算法
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- 1 2 3 4 5 6 7 8 9 = 110的java实现
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 【代码】Pythonの代码片段
- STL中算法
- 数据结构&算法学习
- 算法的时间复杂度
- 算法导论:选择排序的原理与实现
- PHP实现四种常用的排序算法
- 图解插入排序算法
- 一些常见算法的JavaScript实现
- 平方根sqrt()函数的底层算法效率
- 二叉搜索树的一些相关算法介绍
- 欧几里德算法(辗转相处法)练手
- 面试中常见的一些算法问题