数据结构基础:P3-树(上)----编程作业02:List Leaves

本系列文章为浙江大学陈越、何钦铭数据结构学习笔记,系列文章链接如下

数据结构(陈越、何钦铭)学习笔记

文章目录

  • 一、题目描述
  • 二、整体思路与实现代码


一、题目描述

题目描述: 给定一棵树,按照从上到下、从左到右的顺序列出所有叶结点。
输入格式: 每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数N(≤10),为树中的结点总数,结点编号从0到N-1。接着是N行,每一行对应一个结点,并给出该结点的左、右子结点的索引。如果子结点不存在,则在相应位置上给出“-”。任何一对子结点都用一个空格隔开。
输出格式: 对于每个测试用例,在一行中按从上到下、从左到右的顺序打印所有的叶结点索引。相邻数字之间必须有一个空格,行尾不能有多余的空格。
输入样例:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
输出样例:
4 1 5

二、整体思路与实现代码

思路分析

①建树:读取各个节点,存放在一个数组中,建立一棵树。
②找到这棵树的根节点:把数组从头到尾扫描一遍,然后看看有没有哪个结点不存在其他结点指向他。如果没人指向他,他就是根结点了,非根结点肯定有人指向他了。
③层序输出叶节点:层序输出在前面文章已经将讲解过,首先将根结点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队。在此基础上,我们加上对节点属性的判定,如果是叶子节点则将节点编号保存在一个数组中。最后通过便利保存节点编号的数组,将叶子节点编号输出。

整体代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MaxTree 10
#define Null -1    //子树为空时定义为Null
#define Tree int//定义树节点
struct TreeNode {Tree left;   //左子树的下标 Tree right;  //右子树的下标 
}T[MaxTree];//定义一个队列,用于中序遍历时进行入队出队操作
struct Queue {Tree data[MaxTree];  //保存Tree节点int front;  //队首int rear;   //队尾
}Q;//建立一棵树,并返回根节点
Tree BuildTree(struct TreeNode T[])
{int n;    //输入n个节点int i;    Tree Root; //最后找到的根节点int check[MaxTree]; //记录当前各个节点是否已访问char cl, cr;        //保存输入的左、右节点scanf("%d", &n); //输入的ngetchar();//读取回车if (n) {for (i = 0; i < n; i++) check[i] = 0; //初始化各个节点均未被访问for (i = 0; i < n; i++) {		scanf("%c %c", &cl, &cr); //输入的左、右节点getchar();//读取回车	/*对cl的对应处理 */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;}//n个节点中没有被check的就是根节点for (i = 0; i < n; i++)if (!check[i]) break;Root = i;}return Root;
}void LevelOrderTraversal(Tree root)
{if (!root) return;     //若是空树则直接返回Tree leaves[MaxTree];  //保存叶子节点/*初始化队列 根结点放到队列里面去*/Q.front = -1;Q.rear = -1;Q.data[++Q.rear] = root;int t = 0; //用于记录叶节点数量/*然后接下来是一个循环循环做三件事情:第一件事情 从队列里面抛出一个元素第二件事情 把队列刚抛出元素的Data print出来第三件事情 是把它的左右儿子放到队列里去*/while (Q.front != Q.rear) {	 //队列不为空时int i = Q.data[++Q.front];	 //出队if (T[i].left == Null && T[i].right == Null) { //叶节点leaves[t++] = i;}else { //非叶节点,左右子树若存在就入队if(T[i].left != Null)Q.data[++Q.rear] = T[i].left;if (T[i].right != Null)Q.data[++Q.rear] = T[i].right;}		}//实现最后一个节点后面没有空格,其它节点后面有空格for (int i = 0; i < t; i++) {if(i < t - 1)printf("%d ", leaves[i]);elseprintf("%d", leaves[i]);}
}int main()
{Tree A = BuildTree(T);LevelOrderTraversal(A);return 0;
}

运行,输入测试样例,结果正确
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/55368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【填坑向】MySQL常见报错及处理系列(ERROR! The server quit without updating PID file)

本系列其他文章 【填坑向】MySQL常见报错及处理系列&#xff08;Communications link failure & Access denied for user ‘root‘‘localhost‘&#xff09;_AQin1012的博客-CSDN博客翻一下大致的意思就是默认会按照如下的顺序读取配置文件&#xff0c;我上面贴出的配置文…

⛳ Docker 安装 MySQL

&#x1f38d;目录 ⛳ Docker 安装 MySQL&#x1f69c; 一、搜索 mysql , 查看版本&#x1f3a8; 二、拉取mysql镜像&#x1f463; 三、建立容器的挂载文件&#x1f9f0; 四、创建mysql配置文件&#xff0c;my.conf&#x1f3ed; 五、根据镜像产生容器&#x1f381; 六、远程连…

可追溯性在现代产品和系统开发中的关键作用

追溯性在产品、系统和软件开发中起着关键的作用&#xff0c;因为它允许组织能够记录参与产品设计、生产、测试和交付的所有组件和活动。本质上&#xff0c;追溯性就是能够提供一份记录&#xff0c;这份记录展示了一个产品或系统从初始到最终状态的所有过程&#xff0c;以此保证…

Java基础 数据结构一【栈、队列】

什么是数据结构 数据结构是计算机科学中的一个重要概念&#xff0c;用于组织和存储数据以便有效地进行访问、操作和管理。它涉及了如何在计算机内存中组织数据&#xff0c;以便于在不同操作中进行查找、插入、删除等操作 数据结构可以看作是一种数据的组织方式&#xff0c;不…

[NLP]深入理解 Megatron-LM

一. 导读 NVIDIA Megatron-LM 是一个基于 PyTorch 的分布式训练框架&#xff0c;用来训练基于Transformer的大型语言模型。Megatron-LM 综合应用了数据并行&#xff08;Data Parallelism&#xff09;&#xff0c;张量并行&#xff08;Tensor Parallelism&#xff09;和流水线并…

docker-maven-plugin直接把镜像推到私有仓库

接着上篇 推送到本地docker 我们已经把服务做成镜像推到docker&#xff0c;也可以通过docker login 私有地址&#xff0c;去push。麻烦 直接上代码 1、pom改动 <properties><docker.registry>eco-registry.XXX.com</docker.repostory><docker.registry…

docker swarm 部署服务网络问题

docker swarm 服务部署问题 docker swarm 部署服务时可能会出现&#xff0c;启动服务特别慢的情况&#xff0c;甚至一个service 启动后&#xff0c;容器会长时间处于 preparing 状态&#xff0c;直到 状态切换成 running 状态后&#xff0c;才会启动下一个service。然后查询资…

flask中GET和POST的区别

GET和POST是HTTP协议中两种常用的请求方法&#xff0c;它们在如何向服务器发送数据以及数据传输方式上有所不同。下面是GET和POST的主要区别&#xff1a; 一、数据传输位置&#xff1a; GET&#xff1a;将数据通过URL的查询字符串部分&#xff08;即URL的参数&#xff09;传递…

项目---日志系统

目录 项目系统开发环境核心技术日志系统介绍为什么需要日志系统? 日志系统框架设计日志系统模块划分代码实现通用工具实现日志等级模块实现日志消息模块实现格式化模块实现落地模块实现日志器模块同步日志器异步日志器缓冲区实现异步工作器实现 回归异步日志器模块建造者模式日…

KVM创建虚拟机可访问外网+可使用Xshell等工具连接

创建虚拟机时使用桥接网络模块即可&#xff0c;如下&#xff1a; 1、创建一个存储卷(虚拟机的磁盘) 2、创建虚拟机时选择网络 3、系统安装完成后配置固定IP地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0ONBOOTyes BOOTPROTOstatic IPADDR16.32.15.60 GATEWAY16.32.15.2…

C++--两个数组的dp问题(2)

1.交错字符串 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定三个字符串 s1、s2、s3&#xff0c;请判断 s3 能不能由 s1 和 s2 交织&#xff08;交错&#xff09; 组成。 两个字符串 s 和 t 交织 的定义与过程如下&#xff0c;其中每个字符串都…

SpringBoot实现文件上传和下载笔记分享(提供Gitee源码)

前言&#xff1a;这边汇总了一下目前SpringBoot项目当中常见文件上传和下载的功能&#xff0c;一共三种常见的下载方式和一种上传方式&#xff0c;特此做一个笔记分享。 目录 一、pom依赖 二、yml配置文件 三、文件下载 3.1、使用Spring框架提供的下载方式 3.2、通过IOUti…

NIO原理浅析(一)

IO简介 摘抄了下维基百科对IO的定义&#xff0c;Input/Output&#xff0c;输入和输出&#xff0c;通常指数据在存储器或者其他周边设备之间的输出和输入&#xff0c;输入是系统接收到信号或者数据&#xff0c;输出则是从系统发送的信号或数据。 Java IO 读写原理 Java中文件…

[python]问题:python中如何将二维数据的某列打印出来

在Python中,可以使用列表推导式(list comprehension)来从二维数据中提取某一列的数据并打印出来。假设你有一个二维列表data,你想要打印出第n列的数据,可以使用以下代码: data = [[1, 2, 3],[4, 5, 6],[7</

基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统

目录 1、EFK简介 2、EFK框架 2.1、Fluentd系统架构 2.2、Elasticsearch系统架构 2.3、Kibana系统架构 3、Elasticsearch接口 4、EFK在虚拟机中安装步骤 4.1、安装elasticsearch 4.2、安装kibana 4.3、安装fluentd 4.4、进入kibana创建索引 5、Fluentd配置介绍 Elas…

Linux网络编程:多路I/O转接服务器(select poll epoll)

文章目录&#xff1a; 一&#xff1a;select 1.基础API select函数 思路分析 select优缺点 2.server.c 3.client.c 二&#xff1a;poll 1.基础API poll函数 poll优缺点 read函数返回值 突破1024 文件描述符限制 2.server.c 3.client.c 三&#xff1a;epoll …

Elasticsearch(十三)搜索---搜索匹配功能④--Constant Score查询、Function Score查询

一、前言 之前我们学习了布尔查询&#xff0c;知道了filter查询只在乎查询条件和文档的匹配程度&#xff0c;但不会根据匹配程度对文档进行打分&#xff0c;而对于must、should这两个布尔查询会对文档进行打分&#xff0c;那如果我想在查询的时候同时不去在乎文档的打分&#…

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透)

目录 一、缓存预热 二、缓存雪崩 三、缓存击穿 四、缓存穿透 一、缓存预热 开过车的都知道&#xff0c;冬天的时候启动我们的小汽车之后不要直接驾驶&#xff0c;先让车子发动机预热一段时间再启动。缓存预热是一样的道理。 缓存预热就是系统启动前&#xff0c;提前将相关的…

C语言基础之——指针(下)

前言&#xff1a;本篇文章将继续讲解有关指针的剩余基础知识。 学无止境&#xff0c;一起加油叭&#xff01;&#xff01; 目录 一.指针运算 1.指针 - 整数 2.指针的关系运算 3.指针 - 指针 二.指针与数组 三.二级指针 四.指针数组 总结 一.指针运算 指针运算包括以下三…

数据分析基础-数据可视化学习笔记05-交互模型

人类信息处理模型 学习目标 理解交互中的人类认知行为 •人类信息处理模型 •生态模型 •社交互动模型 人类信息处理模型 •在认知心理学中——人类被视为一个信息处理单元 •认知过程被建模为该 IP 单元上的一系列信息过程 •了解人类认知过程&#xff0c;例如推理、…