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

在这里插入图片描述

欢迎来到我的:世界

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


目录

  • 前言
  • 队列的实现
  • 层序遍历详解
  • 强化练习
    • 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.mzph.cn/news/93237.shtml

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

相关文章

计算机毕业设计 基于SSM的高校毕业论文管理系统小程序的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻…

华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos

华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品优势1.3 应用场景1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 memos3.1 memos介绍3.2 Docker 环境搭建…

本地连接服务器 jupyter notebook

本地连接服务器 jupyter notebook 一、前提工作二、服务器操作三、Windows 操作 一、前提工作 准备一台Linux云服务器新建一个用户,并切换到此用户安装 Anaconda 二、服务器操作 远程服务器上安装和配置 Jupyter Notebook: pip3 install jupyter接着…

Monkey测试

一:测试环境搭建 1:下载android-sdk_r24.4.1-windows 2:下载Java 3:配置环境变量:关于怎么配置环境变量(百度一下:monkey环境搭建,) 二:monkey测试&#xff1…

第1篇 目标检测概述 —(3)YOLO系列算法

前言:Hello大家好,我是小哥谈。YOLO(You Only Look Once)系列算法是一种目标检测算法,主要用于实时物体检测。相较于传统的目标检测算法,YOLO具有更快的检测速度和更高的准确率。YOLO系列算法的核心思想是将…

【iptables 实战】06 iptables网络防火墙实验

一、现状说明 在上一节中,我们将两个网段的机器,通过中间机器的网络转发,能达到互通。再来回顾一下这个网络连接的图 这一节,我们将通过设置机器B的iptables规则,来做一些防火墙实验 机器A模拟公网的一台服务器&#…

【kubernetes】使用luakube访问kubernetes api

文章目录 1 kubernetes client2 luakube初体验3 luakube代码分析4 luakube包的调用5 lua相关5.1 self5.2 metatable5.2.1 使用metatable对table新增操作符5.2.2 使用metatable对table新增方法5.2.3 再探luakube 6 参考文档 1 kubernetes client 客户端列出了各种语言对应的访问…

docker系列(9) - docker-compose

文章目录 9. compose编排9.1 介绍9.2 安装9.3 compose常用命令9.4 实战Springboot部署9.4.1 准备组件配置文件9.4.1.1 redis的配置文件9.4.1.2 MySQL的配置文件9.4.1.3 SpringBoot打包文件 9.4.2 准备docker-compose.yml9.4.3 启动服务9.4.4 测试验证 9.5 实战ElasticsearchKib…

SLAM从入门到精通(从amcl到navigation软件栈)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们学习了amcl,但它只是navigation里面的一个package而已。真正的导航还包含很多的内容。举个例子来讨论下,我们假设需…

windows C 开发

在win下用C/C开发 非图形界面 应用程序 基础环境包括3个内容1. API : 一般是系统(包括c标准库和其他dll)提供的2. 编译器 : 可以是gnu的,可以是微软提供的3. 编辑器 : 随意都可以 // 不再考虑范围开发方式(API编译器) 原生windows API 使用 Windows API 来编写非视窗代码。…

基于 QT 实现 Task Timer,高效利用时间

一、开发环境 Ubuntu 20.04 QT6.0 二、新建 Qt Wigets Application 这里的基类选择 Wigets, pro 配置文件添加 sql 模块,需要用到 sqlite, QT sql 三、添加数据库连接头文件 // connection.h #ifndef CONNECTION_H #define CONNECTION_…

Acwing 840. 模拟散列表

Acwing 840. 模拟散列表 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 拉链法&#xff1a; #include <cstring> #include <iostream>using namespace std;const int N 100003;int h[N], e[N], ne[N], idx;void insert(int x) {int k (x % N N) % N;e…

数据分析技能点-机器学习优化思想

优化思想,这个听起来极其专业和高端的词汇,其实它无处不在,悄无声息地影响着我们的生活和决策。从寻找最快的上班路线,到决定如何配置投资组合,优化思想都是一个不可或缺的元素。而在机器学习领域,优化思想更是扮演着至关重要的角色。 文章目录 优化的基础优化问题与实际…

历史服务器

二、配置历史服务器 在spark-3.1.1-bin-hadoop2.7/conf/spark-defaults.conf添加以下配置&#xff0c;其中d:/log/spark为日志保存位置 spark.eventLog.enabled true spark.eventLog.dir file:///d:/log/spark spark.eventLog.compress true spark.history.fs.logDirectory fil…

图神经网络GNN(一)GraphEmbedding

DeepWalk 使用随机游走采样得到每个结点x的上下文信息&#xff0c;记作Context(x)。 SkipGram优化的目标函数&#xff1a;P(Context(x)|x;θ) θ argmax P(Context(x)|x;θ) DeepWalk这种GraphEmbedding方法是一种无监督方法&#xff0c;个人理解有点类似生成模型的Encoder过程…

8.3Jmeter使用json提取器提取数组值并循环(循环控制器)遍历使用

Jmeter使用json提取器提取数组值并循环遍历使用 响应返回值例如&#xff1a; {"code":0,"data":{"totalCount":11,"pageSize":100,"totalPage":1,"currPage":1,"list":[{"structuredId":&q…

字符串,字符数组,类型转换,整数越界,浮点数,枚举

目录 自动类型转换 强制类型转换 数据类型 sizeof 数据类型所占字节数 整数越界 浮点数 字符型 字符串变量 ​编辑字符串的输入输出 main函数的参数 &#xff0c;argc,argv 单个字符输入输出 putchar getchar strlen,strcmp,strcat,strchr,strstr strlen 求字…

云安全之HTTP协议介绍补充

HTTP是一个基于TCP/IP通信协议来传递数据的协议&#xff0c;传输的数据类型为HTML文件、图片文件、查询结果等。HTTP协议一般用于B/S架构。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。 URI、URL、URN HTTP使用统一资源标识符(Uniform Resource ldentif…

【Rust日报】2023-09-30 使用Rust做web抓取

CockroachDB 用rust重新实现 嘿&#xff0c;伙计们&#xff0c;我在 Rust 中实现了一个分布式 SQL 数据库。它就像 CockroachDB 和谷歌Google Spanner。告诉我你的想法。 注意: 这不是生产级别的数据库&#xff0c;这是一个以学习为目的的项目。有许多特性&#xff0c;但是缺少…

【软件工程_UML—StartUML作图工具】startUML怎么画interface接口

StartUML作图工具怎么画interface接口 初试为圆形 &#xff0c;点击该接口在右下角的设置中->Format->Stereotype Display->Label&#xff0c;即可切换到想要的样式 其他方式 在class diagram下&#xff0c;左侧有interface图标&#xff0c;先鼠标左键选择&#xff0…