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

news2025/1/21 2:49:14

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

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

文章目录

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


一、题目描述

题目描述: 给定一棵树,按照从上到下、从左到右的顺序列出所有叶结点。
输入格式: 每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数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); //输入的n
	getchar();//读取回车
	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]);
		else
			printf("%d", leaves[i]);
	}
}

int main()
{
	Tree A = BuildTree(T);
	LevelOrderTraversal(A);

	return 0;
}

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

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

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

相关文章

c语言练习题26:调整数组使奇数位于偶数前面

调整数组使奇数位于偶数前面 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; #include<stdio.h> #include<string.h> void func(int* arr, int len) {int left 0;int right len - 1;while (left < right) {while (left < right && arr[lef…

1427205-93-3|Fmoc-Ser(Ac4Manα1-2Ac3Manα1-2Ac3Manα)-OH是指糖类与氨基酸通过糖苷键连接而成的化合物

糖基化氨基酸是指糖类与氨基酸通过糖苷键连接而成的化合物。这种糖苷键的形成是由于糖类的末端羟基与氨基酸的氨基之间发生脱水缩合反应糖。基化氨基酸具有多种生物学功能&#xff0c;如作为酶、激素和抗体的成分&#xff0c;参与细胞识别和信息传递等。 在生物体内&#xff0c…

resultType和parametertype的区别

文章目录 1. resultType&#xff1a;2. parameterType&#xff1a;3. 总结看这里就够啦&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;举例 1. resultType&#xff1a; 返回值类型&#xff0c;类型即为对象类型&#xff0c;返回结果字段与对象属性…

视频云存储/安防监控视频智能分析网关V3:占道经营功能详解

违规占道经营者经常会在人流量大、车辆集中的道路两旁摆摊&#xff0c;导致公路交通堵塞&#xff0c;给居民出行的造成不便&#xff0c;而且违规占路密集的地方都是交通事故频频发生的区域。 TSINGSEE青犀视频云存储/安防监控视频/AI智能分析网关V3运用视频AI智能分析技术&…

基于Java+SpringBoot+vue前后端分离夕阳红公寓管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

如何利用SFTP协议远程实现更安全的文件传输 ——【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 1. 安装openSSH1.1 安装SSH1.2 启动ssh 2. 安装cpolar2.1 配置termux服务 3. 远程SFTP连接配置3.1 查看生成的随机公…

反转单链表的两种写法

一、反转链表&#xff08;循环写法&#xff09; #include<stdio.h> #include<stdlib.h> struct node{int val;node *next; }; void insert_tail(struct node **ptr, struct node *nd){while(*ptr ! NULL) {ptr &(*ptr)->next;}*ptr nd; } void traverse(…

Java网络编程(三)NIO|Netty实现多人聊天功能

NIO实现 服务端 package com.bierce.io; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; import java.nio.charset.Charset; import java.util.Iterator; import java.util.Set; //服务器端 publ…

记录--为什么要使用 package-lock.json?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 随着JavaScript在现代软件开发中的日益重要地位&#xff0c;Node.js生态系统中的npm成为了不可或缺的工具。在npm管理依赖的过程中&#xff0c;package-lock.json文件的作用日益凸显。本文将深入…

校园跑腿小程序开发方案详解

校园跑腿小程序App的功能有哪些&#xff1f; 1、用户注册与登录 用户可以通过手机号、社交账号等方式进行注册和登录&#xff0c;以便使用跑腿服务。 2、下单与发布任务 用户可以发布各类跑腿任务&#xff0c;包括食品外卖、快递代收、文件送达、帮我买、帮我取、帮我送等等…

【沐风老师】如何在3dMax中将3D物体转化为样条线构成的对象?

在3dMax中如何把三维物体转化为由样条线构成的对象&#xff1f;通常这样的场景会出现在科研绘图或一些艺术创作当中&#xff0c;下面给大家详细讲解一种3dmax三维物体转样条线的方法。 第一部分&#xff1a;用粒子填充3D对象&#xff1a; 1.创建一个三维对象&#xff08;本例…

CSS中如何改变鼠标指针样式(cursor)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS中改变鼠标指针样式&#xff08;cursor&#xff09;⭐ 示例&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅…

1.linux的常用命令

目录 一、Linux入门 二、Linux文件系统目录 三、Linux的vi和vim的使用 四、Linux的关机、重启、注销 四、Linux的用户管理 五、Linux的运行级别 六、Linux的文件目录指令 七、Linux的时间日期指令 八、Linux的压缩和解压类指令 九、Linux的搜索查找指令 ​​​​​​…

idea新建Java-maven项目时,出现Dependency ‘ xxx(jar包名)‘ not found的解决方案

项目场景&#xff1a; 项目场景&#xff1a;使用idea创建maven项目时&#xff0c;导入简单依赖时&#xff08;本文以mysql-connector-java为例&#xff09;。 问题描述 问题&#xff1a; 首先&#xff0c;在创建新的maven项目中&#xff0c;出现下列两种情况&#xff1a; &am…

什么是响应式图片?如何在网页中实现响应式图片?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 响应式图片&#xff08;Responsive Images&#xff09;⭐ 实现响应式图片的方法1. 使用<img>标签的srcset属性2. 使用<picture>元素3. 使用CSS的max-width属性4. 使用响应式图片库 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&…

cs231n assignment3 q4 Generative Adversarial Networks

文章目录 嫌墨迹直接看代码Q4 :Generative Adversarial Networkssample_noise题面解析代码输出 discriminator题面解析代码输出 generator题面解析代码输出 discriminator_loss题面解析代码输出 generator_loss题面解析代码 get_optimizer题面解析代码输出 ls_discriminator_lo…

【Unity3D赛车游戏】【四】在Unity中添加阿克曼转向,下压力,质心会让汽车更稳定

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

10*1000【2】

知识: -----------金融科技背后的技术---------------- -------------三个数字化趋势 1.数据爆炸&#xff1a;internet of everything&#xff08;iot&#xff09;&#xff1b;实时贡献数据&#xff1b;公有云服务->提供了灵活的计算和存储。 2.由计算能力驱动的&#x…

120791-76-6/N-(Fluorenylmethoxycarbonyl)-L-threonine tert-Butyl Ester的化学性质

N-(Fluorenylmethoxycarbonyl)-L-threonine tert-Butyl Ester是一种有机化合物&#xff0c;它的化学结构集成了多种官能团&#xff0c;包括苏氨酸和芴甲氧基羰基等。它经常被用于合成多肽类药物和抗癌药物等。 在合成多肽类药物的过程中&#xff0c;西安凯新生物科技有限公司的…

R语言lasso惩罚稀疏加法(相加)模型SPAM拟合非线性数据和可视化

全文链接&#xff1a;https://tecdat.cn/?p33462 本文将关注R语言中的LASSO&#xff08;Least Absolute Shrinkage and Selection Operator&#xff09;惩罚稀疏加法模型&#xff08;Sparse Additive Model&#xff0c;简称SPAM&#xff09;。SPAM是一种用于拟合非线性数据的强…