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

【数据结构】二叉树——层序遍历

层序遍历

  • 一、层序遍历
  • 二、层序遍历(递归)
  • 三、层序遍历(非递归)
  • 四、总结

一、层序遍历

层序遍历是一种广度优先遍历
在这里插入图片描述
以图上二叉树为例,层序遍历就是按照二叉树的深度一层一层进行遍历
遍历顺序:

A B C D E F G H

二、层序遍历(递归)

若用递归方式解决层序遍历
我们可以先算出二叉树的深度
然后按照不同深度 k 进行遍历
每次向下遍历就 k–
当 k == 1 时就是第 k 层的数据
以此来实现层序遍历

//层序遍历(1)
//(先写一个可以遍历某一层的函数,再循环遍历每一层)//某一层遍历
void BTLevelkOrder(BTNode* php, int k)
{if (php == NULL || k == 0){return;}if (k == 1){printf("%c ", php->val);}BTLevelkOrder(php->left, k - 1);BTLevelkOrder(php->right, k - 1);
}
//层序遍历二叉树
void BTLevelOrder(BTNode* php)
{if (php == NULL){return;}int dep = BTLevelDepth(php);for (int i = 1; i <= dep; i++){BTLevelkOrder(php, i);}
}

在这里插入图片描述

三、层序遍历(非递归)

若要用非递归的方式来解决层序遍历
我们先将根节点入队列
然后将根节点出队列,并将该根节点的左右节点人队列
重复该过程,直到队列为空
队列的代码

在这里插入图片描述

在这里插入图片描述

//层序遍历(2)
//将节点地址依次入队列
void BTLevelOrder(BTNode* php)
{//创建队列Queue p;QueueInit(&p);//先将根入队列if(php)QueuePush(&p, php);while (!QueueEmpty(&p)){//将根位置节点出队列QueueDateType cp = QueueFront(&p);QueuePop(&p);//打印出队列节点的数据printf("%c ", cp->val);//左右节点不为空入队列if (cp->left){QueuePush(&p, cp->left);}if (cp->right){QueuePush(&p, cp->right);}}//队列销毁QueueDesTroy(&p);
}

在这里插入图片描述

四、总结

上面我们学习了递归与非递归的方式去对二叉树进行层序遍历
我们发现递归的代码简介,而且好理解
那我们为什么不用递归而会去研究非递归的方式呢?
因为我们的递归过程会重复调用函数,就会在栈上开辟空间
而栈中空间大小是有限的
若我们的递归深度太深就会有栈溢出的风险
而非递归方式开辟的队列是在堆中开辟的空间会大很多
一般不会出现空间被占满的情况


http://www.mrgr.cn/news/65008.html

相关文章:

  • blender导入的图片渲染看不见,图片预览正常,但渲染不出
  • Oracle OCP认证考试考点详解082系列11
  • 老板电器芯邦CBM7332触摸式净化水槽硬件和程序
  • 算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
  • 【鸿蒙新闻】10月29日警用鸿蒙开发者大会在北京胜利召开,开启智慧应用新时代!
  • 硬件在环仿真建模之电路拓扑建模与数学建模
  • Python Matplotlib 如何处理大数据集的绘制,提高绘图效率
  • 上尚优选项目
  • interrupt、interrupted、isInterrupted方法详解
  • WPF+MVVM案例实战(二十一)- 制作一个侧边弹窗栏(CD类)
  • LeetCode 0685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图)
  • Docker容器消耗资源过多导致宿主机死机解决方案
  • 发现不为人知的AI宝藏:深藏功与名! —— 《第十期》
  • js逆向-模拟加密
  • Linux的IP网路命令: 用于显示和操作网络接口(网络设备)的命令ip link详解
  • masm汇编字符串输出演示
  • ChatGPT 和 RAG(检索增强生成)的区别;ChatGPT 和 RAG 的联系
  • AIGC对传统内容创作行业的冲击
  • 【Linux】make/makefile/gdb调试技巧/进度条小程序
  • 无人机场景 - 目标检测数据集 - 夜间车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 【蓝队技能】【溯源反制】反打红队-蜜罐工具反制
  • SpringBoot集成ELK收集日志管理
  • PyQt5入门级超详细教程中篇
  • 【论文笔记】Dense Connector for MLLMs
  • 引起what(): basic_string::_M_replace_aux问题的一个原因以及解决方法
  • Mysql开发规范