【数据结构】队列实现+层序遍历详解+一些练题

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


目录

  • 前言
  • 队列的实现
  • 层序遍历详解
  • 强化练习
    • 1.判断是不是完全二叉树
    • 求二叉树的最大深度
  • 总结

前言

国庆到了,也要内卷一下,感谢所以老铁们的支持!😎


队列的实现

1、队列的定义
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头;
在这里插入图片描述

队头(Front):允许删除的一端,又称队首。
队尾(Rear):允许插入的一端。
空队列:不包含任何元素的空表。

链式队列存储类型:

typedef int QDatatype;
typedef struct QueueNode
{QDatatype val;//记录每个节点的值struct QueueNode* next;//下一个节点
}QueueNode;typedef struct Queue
{QueueNode* head;//队列的头指针QueueNode* tail;//队列的尾指针int size;//记录队列的元素个数,开始为0;
}Queue;

队列的常见基本操作:

//初始化队列,构造一个空队列pd。
void QueueInit(Queue* pd);
//清除队列,将队列清除,以免空间泄露
void Queuedestroy(Queue* pd);
//入队,若队列pd未满,将x加入,使之成为新的队尾。
void Queuepush(Queue* pd, QDatatype x);
//出队,若队列pd非空,删除队头元素。
void QueuePop(Queue* pd);
//读取队头元素值,并返回值
QDatatype QueueFront(Queue* pd);
//判队列空,若队列pd为空返回true,否则返回false。
bool QueueEmpty(Queue* pd);

链队列初始化

void QueueInit(Queue* pd)
{//构造一个空队列pd->head = pd->tail = NULL;pd->size = 0;
}

链队列入队

void Queuepush(Queue* pd, QDatatype x)
{assert(pd);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc");exit(-1);}newnode->next = NULL;newnode->val = x;if (pd->tail == NULL){pd->head = pd->tail = newnode;}else{pd->tail->next = newnode;pd->tail = newnode;}pd->size++;
}

出队列,删除队头元素

void QueuePop(Queue* pd)
{assert(pd);assert(!QueueEmpty(pd));if (pd->head->next == NULL){free(pd->head);pd->tail = pd->head = NULL;}else{QueueNode* next = pd->head->next;free(pd->head);pd->head = next;}pd->size--;
}

读取队头元素

QDatatype QueueFront(Queue* pd)
{assert(pd);assert(!QueueEmpty(pd));return pd->head->val;
}

判队列空,若队列pd为空返回true,否则返回false。

bool QueueEmpty(Queue* pd)
{assert(pd);return pd->head == NULL;
}

清除队列,释放空间

void Queuedestroy(Queue* pd)
{assert(pd);QueueNode* cur = pd->head;while (cur){QueueNode* next = cur->next;free(cur);cur = next;}pd->head = pd->tail = NULL;pd->size = 0;
}

层序遍历详解

紧接上回,以层来访问,一层一层往下访问,每一层是从左往右访问;

这里用到了队列,将根节点先A存入队列中,然后再将其子节点a b存入队列,再取出根节点A,上述操作为一个循环;而后在存入上一次存入a b 他们分别的子节点,然后在取出来,依次执行操作下去,就是层序遍历;
图解:
在这里插入图片描述
代码实现:

void BinaryTreeLevelOrder(BTNode* root)
{Queue q;QueueInit(&q);//队列初始化//如果根节点不为空,则将其存入队列if (root){Queuepush(&q, root);}//直到队列为空则代表遍历完成while (!QueueEmpty(&q)){BTNode* tem = QueueFront(&q);printf("%d ", tem->val);if (tem->left)//是避免NULL也存入到队列中去Queuepush(&q, tem->left);if (tem->right)//是避免NULL也存入到队列中去Queuepush(&q, tem->right);QueuePop(&q);}Queuedestroy(&q);
}

强化练习

1.判断是不是完全二叉树


地址:oj地址


在这里插入图片描述

解题思路:

要知道完全二叉树是一种什么样的结构:
在这里插入图片描述
所以这道题可以通过层序遍历的方式来解决;

可以看出:完全二叉树的非空节点是连续的,而非完全二叉树的非空节点不是连续的;可以根据这点来解决问题;

int BinaryTreeComplete(BTNode* root)
{Queue q;QueueInit(&q);if (root){Queuepush(&q, root);}//层序遍历出最后一个叶节点,找到第一个空节点while (!QueueEmpty(&q)){BTNode* tem = QueueFront(&q);if (tem == NULL)break;//这是将空节点也存入到了队列中Queuepush(&q, tem->left);Queuepush(&q, tem->right);QueuePop(&q);}//找到了空节点,继续往下找while (!QueueEmpty(&q)){BTNode* tem = QueueFront(&q);QueuePop(&q);if (tem)//如果有一个几点不为空节点,则代表不是连续的空节点,则代表该不是完全二叉树,返回false;{Queuedestroy(&q);return false;}}//否则给该空节点是连续的,证明是完全二叉树,返回trueQueuedestroy(&q);return true;
}

求二叉树的最大深度


地址oj地址


在这里插入图片描述
解题思路:

树的最大深度也就是其最大的高度;求高度的一个思路:
根节点高度=其左右子节点高度高的+1

具体代码实现:

int maxDepth(struct TreeNode* root){if(root==NULL)return 0;int left=maxDepth(root->left);int right=maxDepth(root->right);return left>right?left+1:right+1;
}

如果你知道一个函数fmax那就更简单了;该函数就是用来求两个值返回大的那一个;

代码实现:

int maxDepth(struct TreeNode* root){if(root==NULL)return 0;return fmax(maxDepth(root->left),maxDepth(root->right))+1;}

总结


到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

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

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

相关文章

ElasticSearch 同步数据变少了

一、前言 这几天对接ES遇到几个坑,我们将一张库存表同步到ES发现Docs Count和我们表中的数据对不上,需要加上Docs deleted才对得上,也不知道批量写入数据为什么有些数据就会成 Docs deleted。 二、ID和版本号 ES中每一个Document都有一个_…

c#中的接口

使用IEnumerable统一迭代变量类型 class Program {static void Main(string[] args){int[] nums1 new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(nums1));Console.WriteLine(Sum(nums2));Console.WriteLine(Avg(nums…

oracle-使用PLSQL工具自行修改用户密码

1、使用PLSQL工具,输入用户名和原密码登录,如下图 2、登录后,在会话下拉菜单中找到”Change password..” 3、在跳出的窗口中配置新密码,修改完成后单击”确认”,后退出PLSQL 4、重新打开PLSQL,使用新密码登…

【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现

文章目录 前言一、微服务调用出现的问题1.1 服务消费者如何获取服务提供者的地址信息?1.2 如果有多个服务提供者,消费者该如何选择?1.3 消费者如何得知服务提供者的健康状态? 二、什么是 Eureka2.1 Eureka 的核心概念2.2 Eureka 的…

C语言数据结构之排序整合与比较(冒泡,选择,插入,希尔,堆排序,快排及改良,归并排序,计数排序)

前言:排序作为数据结构中的一个重要模块,重要性不言而寓,我们的讲法为下理论掌握大致的算法结构,再上代码及代码讲解,助你一臂之力。 一,冒泡 冒泡排序应该是大家学习以来第一个认识的排序方法&#xff0…

buuctf-[WUSTCTF2020]CV Maker

打开环境 随便登录注册一下 进入到了profile.php 其他没有什么页面&#xff0c;只能更换头像上传文件&#xff0c;所以猜测是文件上传漏洞 上传一句话木马看看 <?php eval($_POST[a]);?>回显 搜索一下 添加文件头GIF89a。上传php文件 查看页面源代码&#xff0c;看…

Leetcode---364场周赛

题目列表 2864. 最大二进制奇数 2865. 美丽塔 I 2866. 美丽塔 II 2867. 统计树中的合法路径数目 一、最大二进制奇数 这题只要你对二进制有了解(学编程的不会不了解二进制吧)&#xff0c;应该问题不大&#xff0c;这题要求最大奇数&#xff0c;1.奇数&#xff1a;只要保证…

谷歌扩展下载

Chrome 扩展下载安装网站推荐 # 1. 极简插件优质crx应用 ●地址&#xff1a;https://chrome.zzzmh.cn ●推荐&#xff1a;★★★★★ 一个非常良心 & 干净 & 简洁的 Chrome 扩展下载网站&#xff0c;体验非常不错&#xff01; 侧边栏可以通过类型对扩展进行筛选和排序&…

Android LiveData 介绍

Android LiveData 介绍 系列文章目录前言一、LiveData是什么&#xff1f;二、简单使用依赖测试数据准备1.创建可观察的livedata2.观察它3.更新它 总结 系列文章目录 Android LiveData 介绍&#xff08;本文&#xff09; 前言 本系列根据官网介绍Jetpack中的数据通信组件&…

大数据Doris(三):Doris编译部署篇

文章目录 Doris编译部署篇 一、Doris编译

侯捷 C++ STL标准库和泛型编程 —— 4 分配器 + 5 迭代器

4 分配器 4.1 测试 分配器都是与容器共同使用的&#xff0c;一般分配器参数用默认值即可 list<string, allocator<string>> c1;不建议直接用分配器分配空间&#xff0c;因为其需要在释放内存时也要指明大小 int* p; p allocator<int>().allocate(512,…

图像处理: 马赛克艺术

马赛克 第一章 马赛克的历史渊源 1.1 马赛克 艺术中的一种表面装饰&#xff0c;由紧密排列的、通常颜色各异的小块材料&#xff08;如石头、矿物、玻璃、瓷砖或贝壳&#xff09;组成。与镶嵌不同的是&#xff0c;镶嵌是将要应用的部件放置在已挖空以容纳设计的表面中&#xff0…

babel.config.js配置文件详解

文章目录 一、前言三、babel 详解四、拓展阅读 一、前言 项目开发阶段&#xff0c;使用可选链操作符 ?. 出现以下编译报错问题&#xff1a; 分析&#xff1a;由于可选链操作符 ?. 是ES2020&#xff08;即ES11&#xff09;中推出的新语法&#xff0c;允许我们不需要校验当前属…

imgui开发笔记<1>、ubuntu环境下快速应用

去这个链接下载imgui源码&#xff08;在此之前需要安装opengl glfw3等等&#xff09;&#xff1a; sudo apt-get install libglfw3-dev https://github.com/ocornut/imgui 我这里源码下载到/home/temp/imgui目录下&#xff0c;咱们不需要编译源码成库&#xff0c;而是直接将下…

网页采集工具-免费的网页采集工具

在当今数字化时代&#xff0c;网页采集已经成为了众多领域的必备工具。无论是市场研究、竞争情报、学术研究还是内容创作&#xff0c;网页采集工具都扮演着不可或缺的角色。对于许多用户来说&#xff0c;寻找一个高效、免费且易于使用的网页采集工具太不容易了。 147SEO工具的强…

使用prometheus监控java服务

在prometheus官方下载页面没有看到jvm_exproter的下载地址但是官方页面是有推荐下载地址的 访问 Prometheus - Monitoring system & time series database prometheus官方网址 官方推荐地址下载是在github网络访问不方便的可以用下面的网址 wget https://repo1.maven…

SpringCloud Gateway--Predicate/断言(详细介绍)中

&#x1f600;前言 本篇博文是关于SpringCloud Gateway–Predicate/断言&#xff08;详细介绍&#xff09;中&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以…

51单片机数字电压表仿真设计_LCD显示(仿真+程序+原理图+PCB+设计报告+讲解)

51单片机数字电压表仿真设计_LCD显示&#xff08;仿真程序原理图PCB设计报告讲解&#xff09; 原理图&#xff1a;Altium Designer 仿真版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0006 51单片机数…

【新版】系统架构设计师 - 未来信息综合技术

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 未来信息综合技术考点摘要信息物理系统CPS的体系架构CPS 的技术体系CPS应用场景 人工智能分类关键技术机器学习 机器人发展分类机器人4.0 边缘计算概念与特点边云协同安全应用场景 数字孪生关键技…

1 论文笔记:Efficient Trajectory Similarity Computation with ContrastiveLearning

2022CIKM 1 intro 1.1 背景 轨迹相似度计算是轨迹分析任务&#xff08;相似子轨迹搜索、轨迹预测和轨迹聚类&#xff09;最基础的组件之一现有的关于轨迹相似度计算的研究主要可以分为两大类&#xff1a; 传统方法 DTW、EDR、EDwP等二次计算复杂度O(n^2)缺乏稳健性 会受到非…