c语言和c++实现层序遍历
层序遍历是一种二叉树的遍历方式,也称为广度优先遍历,它的遍历顺序是:从上到下,从左到右,一层一层地遍历整棵树。在 C 语言中,我们可以使用队列来实现层序遍历。
具体实现步骤如下:
- 将根节点入队列。
- 当队列不为空时,重复以下步骤:
- 从队头弹出一个节点,访问该节点。
- 如果该节点有左子树,则将左子树入队列。
- 如果该节点有右子树,则将右子树入队列。
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
函数来实现层序遍历。在函数中,我们首先定义了一个队列和两个指针 front
和 rear
,用于记录队头和队尾的位置。然后,将根节点入队列,进入循环。在循环中,我们首先从队头弹出一个节点,访问该节点,然后依次将其左子节点和右子节点入队列。循环结束后,我们完成了整棵树的层序遍历。
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
类型的指针。然后,定义了两个整数变量 front
和 rear
分别表示队首和队尾的下标。
接下来,我们将根节点指针 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++实现层序遍历相关推荐
- 题库明细 C#语言和SQL Server
题库明细 C#语言和SQL Server 第一个C#程序 石振威 了解C#常用关键字(32道) 掌握变量的定义和使用方法(20道) 掌握C#控制台程序的结构组成(20道) 能够使用using和name ...
- C语言和C++关键字总结——一篇就够了
C语言和C++关键字总结 C语言和C 关键字总结 一.auto * 1.C语言 * 2.C 二.struct 三.static * 1.程序的内存分配 * 2.局部静态变量 * 3.全局静态变量 * ...
- PaddlePaddle入门|百度零基础实践深度学习课程笔记——使用Python语言和Numpy库来构建神经网络模型
前面的课程已经讲解了Python的一些基础操作和使用Notebook实现编程的基础知识,下面通过用Python语言和Numpy库来构建神经网络模型来初步实践. 波士顿房价预测任务 问题描述 波士顿房价 ...
- 1000道C语言和C++语言的练习题笔试题及答案 #0000-0050
汇集1000道C语言和C++语言的练习题 (例题.笔试题.编程题.算法设计题),由我亲自配上答案(点此查看). 语法题我就不出了,那个没意思,看书就可以了. 本贴汇集50题 (0000-0050),持 ...
- 代码随想录【day 14 二叉树】| 层序遍历 226.翻转二叉树 101.对称二叉树
代码随想录[day 14 二叉树]| 层序遍历 226.翻转二叉树 101.对称二叉树 层序遍历 卡哥文解 视频讲解 题目链接:102.二叉树的层序遍历 解题思路 代码实现 题目链接:107.二叉树的 ...
- php数字截取2位小树,数据结构-PHP 二分搜索树的层序遍历(队列实现)
前面文章介绍了二分搜索树的 前序遍历.中序遍历.后续遍历,这篇文章主要介绍一下如何使用 队列 实现二分搜索树的 层序遍历. 1.队列 1.1 队列的特点队列(Queue) 是一种线性结构. 只能从一 ...
- bartender一行打印两个二次开发_C++ 智能指针和二叉树:图解层序遍历和逐层打印二叉树...
作者:apocelipes 链接:https://www.cnblogs.com/apocelipes/p/10758692.html 二叉树是极为常见的数据结构,关于如何遍历其中元素的文章更是数不 ...
- 为什么说C语言和linux是分不开的?
为什么说C语言和linux是分不开的? 在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言 ...
- java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...
最新文章
- 饼图大小调整_别让这些细节毁了你的图表,饼图制作的三大准则和七大细节
- Linux-Vim使用技巧
- gulp配置实现修改js、css、html自动刷新
- vs.net 2005 beta 2安装问题
- 算法设计与分析——动态规划——最大字段和问题
- mysql强制指定索引_mysql强制索引和禁止某个索引
- Eclipse代码自动补全设置
- java的左移位()和右移位()和无符号右移()
- svm支持向量机分类方法
- postman|接口测试 | pre-request script 场景应用
- vue yaml代码编辑器组件
- PostgreSQL下载与安装
- 计算机在无法打开情况下怎么重置,电脑提示internet explorer无法打开internet站点怎么办...
- git在push时候出现timeout的解决方法
- html缩小照片尺寸像素不变,怎么把图片变小 像素不变
- Flink 窗口函数(Window Functions)处理迟到数据
- 总结-互联网校招面试锦囊
- HRBUST 1162 魔女【DP】
- classical CNN models : AlexNet 模型结构详解
- java.double和 floa 的区别