立志用最少的代码做最高效的表达


对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。

输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

输出样例:
4 1 5


步骤:
1、按行建树。 因为节点少,因此可以采用数组模拟建树的方式,即伪建树。
2、将所有节点的出现记录在数组中,遍历,若某值没出现,则一定为根。
3、dfs或队列遍历树,存储并输出节点。

总结:
1、对于简单的建树工程,可以采用数组伪建树的方法
2、对于按顺序输出叶节点,可以采用两种方法
  1、采用dfs深度优先搜索,同时将层数加入递归遍历
  2、采用队列层序遍历输出。


DFS解法

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;struct node{char left, right;
}nd[15];vector<int>leaf[15];
void dfs(int s, int cur) {      //cur是层数 if(nd[s].left == '-' && nd[s].right == '-') {leaf[cur].push_back(s);       //记录叶节点 return;}if(nd[s].left != '-') dfs(nd[s].left - '0', cur + 1); //左遍历 if(nd[s].right != '-') dfs(nd[s].right - '0', cur + 1);
}int main() {int n, root[10], rt = 0;memset(root, 0, sizeof(root));cin >> n;for(int i = 0; i < n; i++) {cin >> nd[i].left >> nd[i].right;root[nd[i].left-'0'] = root[nd[i].right-'0'] = 1; //判断根 }for(int i = 0; i < n; i++)   //求根节点 if(!root[i]) {rt = i;break;}dfs(rt, 1);bool f = false;for(int i = 1; i <= 10; i++) {for(int j = 0; j < leaf[i].size(); j++) {if(f) cout << ' ';else f = true;cout << leaf[i][j];}}return 0;
}

队列解法

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;struct node{char left, right;
}nd[15];queue<int>fin;
void Stack(int s) {queue<int>q;q.push(s);while(!q.empty()) {int x = q.front();q.pop();bool flag = false;if(nd[x].left != '-') { q.push(nd[x].left - '0'); flag = true; }if(nd[x].right != '-') { q.push(nd[x].right - '0'); flag = true; }if(flag == false) fin.push(x);  //如果无左无右,则一定为叶,保存。 }
}int main() {int n, root[10], rt = 0;memset(root, 0, sizeof(root));cin >> n;for(int i = 0; i < n; i++) {cin >> nd[i].left >> nd[i].right;root[nd[i].left-'0'] = root[nd[i].right-'0'] = 1; //判断根 }for(int i = 0; i < n; i++)   //求根节点 if(!root[i]) {rt = i;break;}Stack(rt);bool flag1 = false;while(!fin.empty()) {if(!flag1) flag1 = true;else cout << ' ';cout << fin.front();fin.pop();}return 0;
}

      ——只有一种英雄主义,就是在认清生活真相后依然热爱生活

【两种解法】基础实验4-2.2 列出叶结点 (25 分)相关推荐

  1. 【解析】基础实验4-2.5 关于堆的判断 (25 分)

    立志用最少的代码做最高效的表达 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y are ...

  2. 基础实验 6-2.5 城市间紧急救援(25 分)

    作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...

  3. 整数拆分的两种解法(已完成)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 整数拆分 ...

  4. usaco Ordered Fractions 顺序的分数(两种解法)

    这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...

  5. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  6. 牛客--追债之旅 两种解法

    文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...

  7. leetcode 73 矩阵置零 C++ 两种解法

    leetcode 73 两种解法~~,没有一个是我想出来的,哈哈~~ one class Solution {public:void setZeroes(vector<vector<int ...

  8. 北林oj-算法设计与分析-Line up in the canteen(两种解法,附思路)

    描述 One day, there is a kind of new delicious food from one of the windows in the canteen. All studen ...

  9. 洛谷——P1597 语句解析(两种解法)

    P1597 语句解析(两种解法) 题目背景 木有背景-- 题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变 ...

最新文章

  1. java date 操作类_JAVA时间操作类常用方法汇总
  2. Java字符串、文件MD5工具类
  3. python中如何比较两个列表_python中如何比较两个列表
  4. 自学python 编程基础知识_python学习-基础知识-1
  5. 8 种架构设计模式优缺点大曝光 | 原力计划
  6. ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
  7. Go WebSocket开发与测试实践【gorilla/websocket】
  8. webpack多页面开发与懒加载hash解决方案
  9. 中文谐音怎么读_日语零基础学习,谐音法巧记日语50音图发音
  10. dsp c语言流水灯程序,DSP流水灯源程序
  11. goeasy的ios无后台接收消息的一些bug解决
  12. cad填充密度怎么调整_CAD填充比例调好了,填充物数量怎么调,就是密度怎么调?...
  13. CMS漏洞(发货100CMS、SHECMS、ZHCMS、MACCMS)详解实战
  14. 行业专家对2021年的云计算发展趋势的预测
  15. 【报告分享】2021年中国新能源汽车行业洞察-Mob研究院(附下载)
  16. 微服务实施笔记(三)——建立待发现服务
  17. input光标位置设置至行末端
  18. Symantec Backup Exec 2010 Agent For Linux安装
  19. leetcode_977
  20. 【ArcGIS】属性表导出及乱码问题

热门文章

  1. vc得到屏幕的当前分辨率方法
  2. 冷静对待你遇到的所有Java内存异常
  3. 设计模式:观察者模式(Observer)
  4. defer 的前世今生
  5. ​来,一起搞AV,LiveVideoStack Meet再启动
  6. 计算机网络常见问题总结
  7. ./ffmpeg: error while loading shared libraries: libx264.so.138: cannot open shared object file: No s
  8. 最全的搜索引擎优化(SEO)术语表
  9. Ceph 的数据回填和恢复
  10. Hive _分桶及抽样查询