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

这篇具有很好参考价值的文章主要介绍了数据结构基础: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); //输入的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;
}

运行,输入测试样例,结果正确
数据结构基础:P3-树(上)----编程作业02:List Leaves,数据结构基础,数据结构,list,算法,c语言,b树文章来源地址https://www.toymoban.com/news/detail-672828.html

到了这里,关于数据结构基础:P3-树(上)----编程作业02:List Leaves的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API

    Java 是一种由 Sun Microsystems 于 1995 年首次发布的编程语言和计算平台。Java 是一种通用的、基于类的、面向对象的编程语言,旨在减少实现依赖性。它是一个应用程序开发的计算平台。Java 快速、安全、可靠,因此在笔记本电脑、数据中心、游戏机、科学超级计算机、手机等领

    2024年03月24日
    浏览(75)
  • 《数据结构》_PTA_数据结构作业6:图

    1-1 无向连通图所有顶点的度之和为偶数。 T 1-2 无向连通图边数一定大于顶点个数减1 F 1-3 无向连通图至少有一个顶点的度为1。 F 1-4 用邻接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关. F 1-5 用邻接矩阵法存储图,占用的存储空间数只与图中结点个数

    2024年02月04日
    浏览(45)
  • 数据结构——线性表作业

    目录 选择题和填空题 编程题 1. 输出单链表倒数第K个结点值 单链表 双指针 2. 数组元素移动 3. 多项式相加 4. 数组的循环左移 【问题描述】 输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。 【输入形式】 输入第一位为K值,其后接一串

    2024年02月08日
    浏览(26)
  • 02-BTC-数据结构

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 二、区块链 三、Merkel tree 总结     今天看了北大肖臻老师《区块链技术与应用》公开课,有很大收获,在此写博客以做笔记,加深印象,若有不当之处,欢迎斧正。 一、比特币中的数据结构

    2024年01月19日
    浏览(39)
  • 《大话数据结构》02 算法

    算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 大家都已经学过一门计算机语言,不管学的是哪一种,学得好不好,好歹是可以写点小程序了。现在我要求你写一个求1+2+3+……+100结果的程序,你应该怎么写呢?

    2024年04月17日
    浏览(25)
  • 02-链表 (数据结构和算法)

    3.1 链表的基本概念 前面我们在学习顺序表时,线性表的顺序存储结构的特点是逻辑关系上相邻的两个数据元素在物理位置上也是相邻的。我们会发现虽然顺序表的查询很快,时间复杂度为O(1),但是增删的效率是比较低的,因为每一次增删操作都伴随着大量的数据元素移动。为

    2024年02月16日
    浏览(32)
  • HNU数据结构与算法分析-作业2-线性结构

      1. (简答题) 4.1 假设一个线性表包含下列元素: |2,23,15,5,9 使用Shaffer编写的教材《数据结构与算法分析》的List ADT编写一些C++语句,删除值为15的元素。 (要求:采用C或C++语言描述算法) 4.6 使用Shaffer编写的教材《数据结构与算法分析》的LList类,给LList类的实现添加一个成

    2024年02月05日
    浏览(43)
  • 数据结构大作业 校园导航系统

    【问题描述】 以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。 【需求分析】 设计学校的平面图,至少包括

    2024年02月09日
    浏览(29)
  • 数据结构与算法【02】—线性表

    CSDN系列专栏:数据结构与算法专栏 针对以前写的数据结构与算法系列重写(针对文字描述、图片、错误修复),改动会比较大,一直到更新完为止 通过前面数据结构与算法基础知识我们知道了数据结构的一些概念和重要性,那么本章总结下线性表相关的内容。当然,我用自己

    2024年02月05日
    浏览(37)
  • 【Redis】数据结构 - List

    使用场景 Redis数据结构list适用于需要保留多个有序元素的场景,如消息队列、任务队列、最近联系人列表等。具体应用包括: 消息队列:将需要处理的消息按照先后顺序放入list中,再使用消费者程序逐一取出进行处理。 任务队列:将需要执行的任务按照优先级或时间顺序放

    2023年04月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包