二叉树的按层遍历法
程序自己写的,肯定能运行,代码啰不啰嗦暂且不考虑了。
程序功能:【实现二叉树的按层遍历法】
编程关键点:【建立一个队列】【函数递归】
编程思想:
二叉树分好多层,因为要按层遍历,所以如果直接采用函数递归的话,一下子就深入层底了,达不到按层的目的。
所以要换一个角度,按照队列顺序输出!算法步骤如下:
1、把根节点A放入队列,此时队列为:A,队列头指针指向A,也就是队列第一个元素
2、把当前队列头指针所指元素的左右儿子放入队列,即将B C放入队列,此时队列为A B C ,队列头指针向下移一格,此时指向B
3、不断重复2步骤。此时把B的左右儿子取出来放入队尾,队列变为A B C D E,队列头指针后移,指向c,c没有子节点,队列不再延长;
4、结束条件,队列头指针和为指针重合时,输出最后一个元素,算法结束!
也就是说,把这个队列从头到尾输出一遍,就是按层遍历,这个队列是动态的,只要有子节点,子节点就会不停的加入队尾,但总有子节点没有的时候,所以,队列尾指针肯定有不再移动的时候,而头指针一直在一步一步向下移,总会有首尾指针重合的时候,即标志着算法结束。
具体步骤:
1、定义一个二叉树结构
typedef struct binode
{
char data;
struct binode * lchild;
struct binode * rchild;
}BiTree;
2、前序建立二叉树
BiTree * CreatBiTree()
{
BiTree *T;
char data;
fflush(stdin);
scanf("%c",&data);
if(data=='#')T=NULL;
else
{
T=(BiTree *)malloc(sizeof(BiTree));
T->data=data;
T->lchild=CreatBiTree();
T->rchild=CreatBiTree();
}
return T;
}
3、按层遍历二叉树
void Layer_order(BiTree * TNode,BiTree ** F,BiTree ** R)
{
*F=TNode; //将当前节点放入队列首指针所指位置
printf("%c ",(*F)->data);
if((*F)->lchild!=NULL)
{
R=R+1;
*R=(*F)->lchild; //节点的左儿子放入队尾
}
if((*F)->rchild!=NULL)
{
R=R+1; //首指针向后移动一格
*R=(*F)->rchild; //节点的右儿子放入队尾
}
if(F!=R)
{
F=F+1;
Layer_order(*F,F,R);//递归
}
}
4、写main函数,建立一个队列,长度1024,存放节点指针(其实就是一个存放指针的数组),这一部分放在main函数中,这个队列是唯一的,不参与递归
BiTree ** F; //队首指针 指向指针的指针,因为队列数组里的元素全是指针
BiTree ** R; //队尾指针
BiTree * Queue[1024];//队列数组
F=Queue;
R=Queue; //开始时队首队尾指针重合
BiTree * root; //在main函数中建立一个二叉树根的指针
root=CreatBiTree(); //创建树
Layer_order(root,F,R); //按层遍历树
全部完成!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2019-09-19 三种构建方式:Makefile、scons、scons cmake+ninja
2019-09-19 scons 简单入门
2019-09-19 使用 Ninja 代替 make
2018-09-19 jstack调试core文件
2018-09-19 JVM致命错误日志(hs_err_pid.log)解读