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

这篇具有很好参考价值的文章主要介绍了【数据结构】队列实现+层序遍历详解+一些练题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

欢迎来到我的:世界

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


前言

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


队列的实现

1、队列的定义
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头;
【数据结构】队列实现+层序遍历详解+一些练题,数据结构,c语言

队头(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 他们分别的子节点,然后在取出来,依次执行操作下去,就是层序遍历;
图解:
【数据结构】队列实现+层序遍历详解+一些练题,数据结构,c语言
代码实现:

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地址


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

解题思路:

要知道完全二叉树是一种什么样的结构:
【数据结构】队列实现+层序遍历详解+一些练题,数据结构,c语言
所以这道题可以通过层序遍历的方式来解决;

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

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;
        }

    }
	//否则给该空节点是连续的,证明是完全二叉树,返回true
    Queuedestroy(&q);
    return true;
}

求二叉树的最大深度


地址oj地址


【数据结构】队列实现+层序遍历详解+一些练题,数据结构,c语言
解题思路:

树的最大深度也就是其最大的高度;求高度的一个思路:
根节点高度=其左右子节点高度高的+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;
    
}

总结


到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的
文章来源地址https://www.toymoban.com/news/detail-715471.html

到了这里,关于【数据结构】队列实现+层序遍历详解+一些练题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构】二叉树的层序遍历(四)

     目录 一,层序遍历概念 二,层序遍历的实现         1,层序遍历的实现思路         2,创建队列         Queue.h         Queue.c         3,创建二叉树         BTree.h         BTree.c         4,层序遍历的实现 层序遍历:除了先序遍历、中序遍历、

    2024年02月07日
    浏览(38)
  • 【数据结构】二叉树的前序遍历、中序遍历、后序遍历、层序遍历

    文章目录 1.二叉树的概念 1.1概念 1.2存储方式 1.3特殊的二叉树  1.4规律 2.二叉树的实现 2.1表现方式 2.2遍历     2.2.1前序遍历   思想   代码   详细分析      2.2.2中序遍历     2.2.3后序遍历     2.2.4层序遍历   思想   代码   详细过程         一棵二叉树是结点的一

    2024年04月23日
    浏览(28)
  • 【数据结构入门】二叉树的遍历(前序、中序、后序、层序)

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 什么是二叉树遍历: 二叉树遍历就是按照某种特定的规则,依次堆二叉树中的结点进行相应的操作,并且 每个结点只操作一次 。访问结点

    2023年04月09日
    浏览(30)
  • 【数据结构与算法】力扣:二叉树的层序遍历

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root = [1] 输出:[[1]] 示例 3: 输入:root = [] 输出:[] 来源:力扣(LeetCode) 链接:https://leetcode.cn/p

    2024年02月13日
    浏览(36)
  • 【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 (1) 先序遍历 的过

    2024年01月24日
    浏览(34)
  • 【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)

     🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: 《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 ​ ​​​ 目录  层序遍历  层序遍历函数实现 判断二叉树是否为完全二叉树 二叉树性质        💬 hello! 各位铁子们大

    2024年01月24日
    浏览(38)
  • 【C++】【数据结构】循环队列的基本操作(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度)顺序队列的算法实现【附全代码】

    使用c++完成数据结构循环队列的基本操作,包括(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度等),可直接编译运行。 队列 又称为 “先进先出” (FIFO)线性表。限定插入操作只能在队尾进行,而删除操作只能在队首进行。 循环队列 ——采用 顺序存储结构

    2023年04月16日
    浏览(42)
  • 【数据结构】队列(Queue)的实现 -- 详解

    1、概念 队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有 先进先出 FIFO(First In First Out)。 入队列 :进行 插入 操作的一端称为 队尾 。 出队列 :进行 删除 操作的一端称为 队头 。 2、结构 (1)队列的顺序存储结构 入队 ,不需要

    2024年02月15日
    浏览(28)
  • 【算法与数据结构】队列的实现详解

    队列的概念: 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 新添加的元素添加到队尾,只能从队头取出元素。 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 队列特征如

    2024年04月13日
    浏览(32)
  • 【数据结构】队列篇| 超清晰图解和详解:循环队列模拟、用栈实现队列、用队列实现栈

    博主简介: 努力学习的22级计算机科学与技术本科生一枚🌸 博主主页: @是瑶瑶子啦 每日一言🌼: 每一个不曾起舞的日子,都是对生命的辜负。——尼采 🔗622. 设计循环队列 👧🏻 思路: 🍊数据结构: 使用数组为数据结构,且采用牺牲一个空间的方法来包装判空和判满的

    2024年02月11日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包