当前位置: 首页 > news >正文

看完这篇我不信你不会二叉树的层序遍历【C语言】

目录

实现思路

代码实现


之前介绍了二叉树的前、中、后序三种遍历,采用的是递归的方式。今天我们来学习另外一种遍历方式——层序遍历。层序遍历不容小觑,虽然实现方法并不难,但是它所采取的思路是很值得学习的,与前三者不同,我们将采用非递归的方式实现。

层序遍历:从二叉树的根节点出发(设根节点所在为第一层),从上到下,从左到右的一次访问第一、第二、第三......层的节点。

实现思路

我们将采用一种数据结构——队列来实现层序遍历。以这样的二叉树为例:

我们知道队列有个重要的性质,只能从队尾进数据,在队头出数据

因此我们先将 1 入队。

接着让队头的元素 1 出队。在 1 出队的同时有个约定:将 1 所在节点的左、右孩子入队;

接着让队头的元素 2 出队。在 2 出队的同时,将 2 所在节点的左、右孩子入队(若为空节点则不入队);

队头元素 4 出队,左、右孩子入队;

队头元素 3 出队,左、右孩子入队;

队头元素 5 出队,左、右孩子入队;

......

最后,队列为空即表示所有节点都已访问完毕。

代码实现

因为此处用到了队列的知识,若有不明白队列的童鞋可以去看看<队列>的概念&结构&实现【C语言版】小补一下哦。

//队列的初始化
void QueueInit(Queue* pq);
//释放malloc出的内存
void QueueDestroy(Queue* pq);
//入队
void QueuePush(Queue* pq, QDataType x);
//出队
void QueuePop(Queue* pq);
//获取队头的数据
QDataType QueueFront(Queue* pq);
//判断队列是否为空
bool QueueEmpty(Queue* pq);//层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{Queue q;QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);printf("%d ", front->data);QueuePop(&q);if(front->left)QueuePush(&q, front->left);if(front->right)QueuePush(&q, front->right);}printf("\n");QueueDestroy(&q);
}

http://www.lryc.cn/news/34660.html

相关文章:

  • 案例17-环境混用带来的影响
  • 知识蒸馏论文阅读:DKD算法笔记
  • Sentinel架构篇 - 熔断降级
  • shell脚本的一些记录 与jenkins的介绍
  • JVM的了解与学习
  • 提升数字品牌的5个技巧
  • java通过反射获取加了某个注解的所有的类
  • Warshall算法
  • vector中迭代器失效的问题及解决办法
  • 【蓝桥杯刷题训练营】day05
  • 线程中断interrupt导致sleep产生的InterruptedException异常
  • ubuntu的快速安装与配置
  • 人工智能AI工具汇总(AIGC ChatGPT时代个体崛起)
  • 【rust-grpc-proxy】在k8s中,自动注入代理到pod中,再不必为grpc调试而烦恼
  • VisualStudio2022制作多项目模板及Vsix插件
  • 仿写简单IOC
  • liunx下安装node exporter
  • lambda函数
  • 【Python入门第二十七天】Python 日期
  • C++基础知识【5】数组和指针
  • Vim使用操作命令笔记
  • 【论文阅读】Robust Multi-Instance Learning with Stable Instances
  • 洛谷 P5116 [USACO18DEC]Mixing Milk B
  • 华为OD机试 - 最左侧冗余覆盖子串(C 语言解题)【独家】
  • 《Netty》从零开始学netty源码(三)之SelectorProvider
  • 实验7 图像水印
  • 如何实现大文件断点续传、秒传
  • 备战蓝桥python——完全平方数
  • WebRTC中的NAT穿透
  • SpringCloud-高级篇(一)