全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案汇总

题目:Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a "-" will be put at the position. Any pair of children are separated by a space.

Output Specification:

For each test case, print in one line all the leaves' indices in the order of top down, and left to right. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.

输入规格:

每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数N(≤10),它是树中节点的总数,因此节点的编号从0到N−1。接下来是N行,每行对应一个节点,并给出节点的左右子节点的索引。如果孩子不存在,将在该位置加“-”。任何一对孩子都被一个空格隔开。

输出规格:

对于每个测试用例,按自上而下和从左到右的顺序在一行中打印所有叶子的索引。任何相邻的数字之间必须正好有一个空格,并且在行尾没有多余的空格。

Sample Input:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

Sample Output:

4 1 5

解答:

乍看一下这个题,感觉,和上面那个题一样?虽然不完全一样但是相当类似,不过这个题更简单,每行输入连元素都省略了。

现在先附上前面几行代码:

#include <iostream>
#include <queue>
using namespace std;#define MaxTree 100
#define ElementType char
#define Tree int
#define Null -1queue<int> myquene;struct TreeNode
{Tree Left;Tree Right;
} T1[MaxTree], T2[MaxTree];
int check[MaxTree];
int leafsNum[MaxTree];
int leafsCount = 0;

在这里我们还是使用上一个题目构建好的代码,只不过TreeNode里面少了一个element成员。

因为这个题是层序遍历的,所以需要用到队列,我们直接使用stl里面的队列即可。

这个check数组和上题一样,是用来找根节点的。树的构建方法也是和上个题几乎完全一样,只是不用再输入一个element元素了。

重复的代码我们不再贴上(因为最后会给出整体的直接测试可通过的代码)。

之所以需要一个leafsNum数组来存叶节点,是因为我们最后打印的时候,最后面不能加一个空格,也就是说,如果我们输出的每个数据是 数字+空格,最后会多一个空格,这样就错了(我没验证,但是既然题目说行尾没有多余的空格我们就严格照办)

现在我们需要写一个函数来进行层序遍历:

void printTree(Tree R1) {myquene.push(R1);while (!myquene.empty()) {int Tadd = myquene.front();myquene.pop();if (T1[Tadd].Left == Null && T1[Tadd].Right == Null)leafsNum[leafsCount++] = Tadd;if (T1[Tadd].Left != Null)myquene.push(T1[Tadd].Left);if (T1[Tadd].Right != Null)myquene.push(T1[Tadd].Right);}for (int i = 0;i < leafsCount - 1;i++) {cout << leafsNum[i] << " ";}cout << leafsNum[leafsCount - 1];
}

这种算法的思想在数据结构视频里讲得很详细,就是通过队列进行的层序遍历,这里就不再赘述了。我们只打印左右两边都是空的叶节点。

最后全部代码附上:


#include <iostream>
#include <queue>
using namespace std;#define MaxTree 100
#define ElementType char
#define Tree int
#define Null -1queue<int> myquene;struct TreeNode
{Tree Left;Tree Right;
} T1[MaxTree], T2[MaxTree];
int check[MaxTree];
int leafsNum[MaxTree];
int leafsCount = 0;
Tree BuildTree(struct TreeNode T[]);
void printTree(Tree R1);int main()
{Tree R1;R1 = BuildTree(T1);if (R1 == -1) {printf("Yes\n");}else{printTree(R1);}system("pause");return 0;
}Tree BuildTree(TreeNode T[])
{int N;int Root = -1;cin >> N;if (N) {for (int i = 0; i<N; i++) check[i] = 0;//先都初始化为0for (int i = 0; i<N; i++) {char cl, cr;//之前不小心把这个写成了int,结果出现奇怪的错误cin >> cl >> cr;if (cl != '-') {T[i].Left = cl - '0';check[T[i].Left] = 1;}else T[i].Left = Null;//对cr的对应处理if (cr != '-') {T[i].Right = cr - '0';check[T[i].Right] = 1;}else T[i].Right = Null;}int i;for (i = 0; i<N; i++)if (!check[i]) break;Root = i;}return Root;
}void printTree(Tree R1) {myquene.push(R1);while (!myquene.empty()) {int Tadd = myquene.front();myquene.pop();if (T1[Tadd].Left == Null && T1[Tadd].Right == Null)leafsNum[leafsCount++] = Tadd;if (T1[Tadd].Left != Null)myquene.push(T1[Tadd].Left);if (T1[Tadd].Right != Null)myquene.push(T1[Tadd].Right);}for (int i = 0;i < leafsCount - 1;i++) {cout << leafsNum[i] << " ";}cout << leafsNum[leafsCount - 1];
}

测试全部通过。

算法 树2 List Leaves相关推荐

  1. LCA 朴素算法+树差分倍增+Tarjan算法 三种算法实现c++代码实现

    哔哩哔哩up视频:https://www.bilibili.com/video/BV1nE411L7rz?t=379 转载:http 文章目录 树差分 & 倍增LCA Tarjan 朴素算法 ...

  2. 数据结构与算法:树 二叉树入门(一)

    Tips: 采用java语言,关注博主,底部附有完整代码 工具:IDEA 本系列介绍的是数据结构: 树 这是第1篇目前计划一共有12篇: 二叉树入门 本篇 顺序二叉树 线索化二叉树 堆排序 赫夫曼树( ...

  3. Morris遍历算法 树的中序遍历

    Morris遍历算法 树的中序遍历 树的中序遍历 一.普通方法 1.递归实现 2.栈实现 二.Morris遍历 1.算法 2.代码 总结 树的中序遍历 对于当前结点,先输出它的左孩子,然后输出该结点, ...

  4. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  5. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

  6. python遍历树结构_python 数据结构与算法——树的遍历

    1.广度优先遍历 2.深度优先遍历 先序遍历:把根放在最前面 中序遍历:把根放在中间 后序遍历:把根放在后面 # -*- coding: utf-8 -*- """ Cr ...

  7. 数据结构与算法——树和二叉树***

    第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...

  8. JavaScript数据结构与算法 - 树

    1. 树数据结构 树是一种分层数据的抽象模型 树是一种非顺序的数据结构 树对于存储需要快速查找的数据非常有用 常见例子:如公司的组织架构图 树结构: 2. 二叉树和二叉搜索树 二叉树: 只能有左右两个 ...

  9. 快速求区间和的有趣算法——树状数组

    好久没写东西,感觉有写些什么的必要了.(高仿鲁迅) 树状数组虽然听起来名字高大上,但是不是很难(前缀和是名字高大上,却水得像海洋) 树状数组在单纯的查询一个区间的和和修改某一个数的效率要超过线段树哦! ...

最新文章

  1. [C] 层层递进——C语言实现广度优先搜索
  2. 爱拉托逊斯方法以及素数判断
  3. typescript 判断异步执行已经结束_vue进阶系列——用typescript玩转vue和vuex
  4. 数据结构之红黑树插入案例详解
  5. docker mysql 镜像 下载_docker mysql 镜像下载
  6. 免费好用的英语单词统计软件(带翻译功能)
  7. 大神如何用油猴提升前端开发效率 ?
  8. python中interval函数_python pandas Interval用法及代码示例
  9. html如何加页脚,html-如何将页脚扩展到页面底部?
  10. 超最小二乘椭圆拟合函数----MATLAB实现
  11. JAVA 实现语音播报
  12. Android之在app图标添加角标
  13. 基于高德地图的交通数据分析
  14. 怎么把有些网站上不能复制的文字复制下来
  15. P44 单行子查询案例分析
  16. PHP环境安装步骤及详解
  17. html测验小题目(来源于W3School)
  18. 欧拉函数-matlab代码
  19. BMP编程实践1:C语言实现bmp位图分析与创建
  20. 山中无富途,“老虎”称大王?

热门文章

  1. mysql安装完为什么打不开,mysql安装打不开的解决方法
  2. linux C++ 使用openssl rsa算法实现对计算机物理地址进行签名和认证
  3. MYSQL表中的一行数据最多能存储多少个字
  4. USB CDC 程序架构分析
  5. linux常用命令--系统状态篇
  6. 高端的下载器you-get
  7. Damien Rice 的歌
  8. 修改IE为默认浏览器
  9. Django 学习记录 第一天
  10. PMP考试 项目启动会和项目开工会议的区别(转载)