层序遍历是一种二叉树的遍历方式,也称为广度优先遍历,它的遍历顺序是:从上到下,从左到右,一层一层地遍历整棵树。在 C 语言中,我们可以使用队列来实现层序遍历。

具体实现步骤如下:

  1. 将根节点入队列。
  2. 当队列不为空时,重复以下步骤:
    • 从队头弹出一个节点,访问该节点。
    • 如果该节点有左子树,则将左子树入队列。
    • 如果该节点有右子树,则将右子树入队列。

1.下面是使用队列实现层序遍历的 C 语言代码:

#include <stdio.h>
#include <stdlib.h>struct Node {int val;struct Node* left;struct Node* right;
};struct Node* createNode(int val) {struct Node* node = (struct Node*)malloc(sizeof(struct Node));node->val = val;node->left = NULL;node->right = NULL;return node;
}void levelOrderTraversal(struct Node* root) {if (root == NULL) {return;}struct Node* queue[1000];int front = 0;int rear = 0;queue[rear++] = root;while (front < rear) {struct Node* node = queue[front++];printf("%d ", node->val);if (node->left != NULL) {queue[rear++] = node->left;}if (node->right != NULL) {queue[rear++] = node->right;}}
}int main() {struct Node* root = createNode(1);root->left = createNode(2);root->right = createNode(3);root->left->left = createNode(4);root->left->right = createNode(5);root->right->left = createNode(6);root->right->right = createNode(7);levelOrderTraversal(root);return 0;
}

在上面的代码中,我们首先定义了一个结构体 Node 来表示二叉树的节点,以及一个函数 createNode 来创建新的节点。然后,我们实现了 levelOrderTraversal 函数来实现层序遍历。在函数中,我们首先定义了一个队列和两个指针 frontrear,用于记录队头和队尾的位置。然后,将根节点入队列,进入循环。在循环中,我们首先从队头弹出一个节点,访问该节点,然后依次将其左子节点和右子节点入队列。循环结束后,我们完成了整棵树的层序遍历。

struct Node* queue[1000];int front = 0;int rear = 0;queue[rear++] = root;while (front < rear) {struct Node* node = queue[front++];printf("%d ", node->val);if (node->left != NULL) {queue[rear++] = node->left;}if (node->right != NULL) {queue[rear++] = node->right;}}
}

这段代码使用了一个数组 queue 来辅助进行二叉树的层序遍历,是一种不使用 C++ 标准库的实现方式。我们首先定义了一个 queue 数组,其大小为 1000,存储的元素是指向 Node 类型的指针。然后,定义了两个整数变量 frontrear 分别表示队首和队尾的下标。

接下来,我们将根节点指针 root 存储在 queue 数组的队尾,并将 rear 的值加一,表示入队操作完成。然后,进入一个循环,只要队列不为空,就一直执行循环。在循环内部,我们首先从队列中取出队首元素,即二叉树中当前层的最左边的节点,将其存储在名为 node 的指针变量中。然后,我们输出 node 的值,即该节点的 val 属性。

接下来,我们判断该节点的左右子节点是否存在,如果存在,就将它们的指针存储在 queue 数组的队尾,并将 rear 的值加一,表示入队操作完成。这样,队列中存储的元素就是下一层的所有节点。当当前层的所有节点都被取出并输出后,循环继续执行,取出队列中的下一个节点,重复上述步骤,直到遍历完整个二叉树。

这个算法的时间复杂度为 $O(n)$,其中 $n$ 是二叉树的节点数。因为我们需要遍历每个节点一次,而每个节点最多进队一次出队一次,所以队列的操作次数也是 $O(n)$ 级别的。

2.下面是使用队列实现层序遍历的 C++ 代码:

#include <iostream>
#include <queue>
using namespace std;struct Node {int val;Node* left;Node* right;Node(int v) : val(v), left(nullptr), right(nullptr) {}
};void levelOrderTraversal(Node* root) {if (root == nullptr) {return;}queue<Node*> q;q.push(root);while (!q.empty()) {Node* node = q.front();q.pop();cout << node->val << " ";if (node->left != nullptr) {q.push(node->left);}if (node->right != nullptr) {q.push(node->right);}}
}int main() {Node* root = new Node(1);root->left = new Node(2);root->right = new Node(3);root->left->left = new Node(4);root->left->right = new Node(5);root->right->left = new Node(6);root->right->right = new Node(7);levelOrderTraversal(root);return 0;
}

在上面的代码中,我们首先定义了一个结构体 Node 来表示二叉树的节点,并且在结构体中使用了构造函数来方便创建新的节点。然后,我们实现了 levelOrderTraversal 函数来实现层序遍历。在函数中,我们首先定义了一个队列 q,将根节点入队列,进入循环。在循环中,我们首先从队头弹出一个节点,访问该节点,然后依次将其左子节点和右子节点入队列。循环结束后,我们完成了整棵树的层序遍历。

queue<Node*> q;q.push(root);while (!q.empty()) {Node* node = q.front();q.pop();cout << node->val << " ";if (node->left != nullptr) {q.push(node->left);}if (node->right != nullptr) {q.push(node->right);

这段代码使用了 C++ 的标准库中的 queue 来辅助进行二叉树的层序遍历。我们首先定义了一个名为 q 的队列,队列中存储的元素是指向 Node 类型的指针。然后,将根节点指针 root 压入队列中,表示从根节点开始遍历。

接下来,我们进入一个循环,只要队列不为空,就一直执行循环。在循环内部,我们首先从队列中取出队首元素,即二叉树中当前层的最左边的节点,将其存储在名为 node 的指针变量中。然后,我们输出 node 的值,即该节点的 val 属性。

接下来,我们判断该节点的左右子节点是否存在,如果存在,就将它们的指针压入队列中。这样,队列中存储的元素就是下一层的所有节点。当当前层的所有节点都被取出并输出后,循环继续执行,取出队列中的下一个节点,重复上述步骤,直到遍历完整个二叉树。

这个算法的时间复杂度为 $O(n)$,其中 $n$ 是二叉树的节点数。因为我们需要遍历每个节点一次,而每个节点最多进队一次出队一次,所以队列的操作次数也是 $O(n)$ 级别的。空间复杂度为 $O(w)$,其中 $w$ 是二叉树的最大宽度,也就是某一层节点数的最大值。因为我们需要使用队列来存储每一层的节点,所以空间复杂度取决于二叉树的最大宽度。

c语言和c++实现层序遍历相关推荐

  1. 题库明细 C#语言和SQL Server

    题库明细 C#语言和SQL Server 第一个C#程序 石振威 了解C#常用关键字(32道) 掌握变量的定义和使用方法(20道) 掌握C#控制台程序的结构组成(20道) 能够使用using和name ...

  2. C语言和C++关键字总结——一篇就够了

    C语言和C++关键字总结 C语言和C 关键字总结 一.auto * 1.C语言 * 2.C 二.struct 三.static * 1.程序的内存分配 * 2.局部静态变量 * 3.全局静态变量 * ...

  3. PaddlePaddle入门|百度零基础实践深度学习课程笔记——使用Python语言和Numpy库来构建神经网络模型

    前面的课程已经讲解了Python的一些基础操作和使用Notebook实现编程的基础知识,下面通过用Python语言和Numpy库来构建神经网络模型来初步实践. 波士顿房价预测任务 问题描述 波士顿房价 ...

  4. 1000道C语言和C++语言的练习题笔试题及答案 #0000-0050

    汇集1000道C语言和C++语言的练习题 (例题.笔试题.编程题.算法设计题),由我亲自配上答案(点此查看). 语法题我就不出了,那个没意思,看书就可以了. 本贴汇集50题 (0000-0050),持 ...

  5. 代码随想录【day 14 二叉树】| 层序遍历 226.翻转二叉树 101.对称二叉树

    代码随想录[day 14 二叉树]| 层序遍历 226.翻转二叉树 101.对称二叉树 层序遍历 卡哥文解 视频讲解 题目链接:102.二叉树的层序遍历 解题思路 代码实现 题目链接:107.二叉树的 ...

  6. php数字截取2位小树,数据结构-PHP 二分搜索树的层序遍历(队列实现)

    ​前面文章介绍了二分搜索树的 前序遍历.中序遍历.后续遍历,这篇文章主要介绍一下如何使用 队列 实现二分搜索树的 层序遍历. 1.队列 1.1 队列的特点队列(Queue) 是一种线性结构. 只能从一 ...

  7. bartender一行打印两个二次开发_C++ 智能指针和二叉树:图解层序遍历和逐层打印二叉树...

    作者:apocelipes  链接:https://www.cnblogs.com/apocelipes/p/10758692.html 二叉树是极为常见的数据结构,关于如何遍历其中元素的文章更是数不 ...

  8. 为什么说C语言和linux是分不开的?

    为什么说C语言和linux是分不开的? 在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言 ...

  9. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

最新文章

  1. 饼图大小调整_别让这些细节毁了你的图表,饼图制作的三大准则和七大细节
  2. Linux-Vim使用技巧
  3. gulp配置实现修改js、css、html自动刷新
  4. vs.net 2005 beta 2安装问题
  5. 算法设计与分析——动态规划——最大字段和问题
  6. mysql强制指定索引_mysql强制索引和禁止某个索引
  7. Eclipse代码自动补全设置
  8. java的左移位()和右移位()和无符号右移()
  9. svm支持向量机分类方法
  10. postman|接口测试 | pre-request script 场景应用
  11. vue yaml代码编辑器组件
  12. PostgreSQL下载与安装
  13. 计算机在无法打开情况下怎么重置,电脑提示internet explorer无法打开internet站点怎么办...
  14. git在push时候出现timeout的解决方法
  15. html缩小照片尺寸像素不变,怎么把图片变小 像素不变
  16. Flink 窗口函数(Window Functions)处理迟到数据
  17. 总结-互联网校招面试锦囊
  18. HRBUST 1162 魔女【DP】
  19. classical CNN models : AlexNet 模型结构详解
  20. java.double和 floa 的区别

热门文章

  1. 03-做一个通读Vue源码的计划吧
  2. 斗地主机器人智能算法深度研究
  3. 1059604-93-1,m-PEG13-Ms甲磺酸基是亲核取代反应的良好离开基
  4. 赏金猎人系列-如何测试sso相关的漏洞
  5. CAD偏移尺寸出问题该如何解决?
  6. 腾讯焦虑了,一向温文尔雅的马化腾也发脾气了
  7. stm32检测串口空闲的原理
  8. Word,Excel未保存,突然断电?找回死机后未储存的Word,Excel文件
  9. Python下载网易云歌单歌曲,这个脚本你给多少分!
  10. 爬虫学习:实现对彼岸图4k图片的下载