代码实现层序遍历二叉树(C语言)

简介: 代码实现层序遍历二叉树(C语言)

深度和广度优先遍历

代码实现二叉树的前中后序遍历,其实这种遍历叫深度优先遍历。即这种遍历和二叉树深度有关,访问到最深,递归回来继续访问其他的。


而层序遍历,就是广度优先遍历,即以根为主,一层一层往下遍历。借助队列的先进先出。核心思路就是:上一层带下一层。


层序遍历思路和代码实现

思路

图片.png

借助队列先进先出的方法,以上面二叉树为例,先访问第一层根结点A,放到队列里面,此时判断队列不为空,因为有结点A。然后A出队列先遍历A。


再把下一层B和C放入队列,此时判断队列不为空。取出结点B,一次只能取一个。


再把B的下一层D和E放入队列,此时判断队列不为空,队列有CDE。然后取出结点C


结点C下面没有其他与之相连结点,此时队列还有DE,取出结点D


D下面没有结点,此时队列还有E,取出结点E。E下一层也没有其他结点


最后判断队列为空,遍历结束。


遍历结束标志:队列为空。


代码实现

队列相关代码

Queue.h

#pragma once#include <stdio.h>#include <stdbool.h>#include <assert.h>#include <stdlib.h>// 前置声明typedefcharBTDataType;
typedefstructBinaryTreeNode{
structBinaryTreeNode*left;
structBinaryTreeNode*right;
BTDataTypedata;
}BTNode;
typedefstructBinaryTreeNode*QDataType;
typedefstructQueueNode{
structQueueNode*next;
QDataTypedata;
}QNode;
typedefstructQueue{
QNode*head;
QNode*tail;
}Queue;
voidQueueInit(Queue*pq);
voidQueueDestory(Queue*pq);
// 队尾入voidQueuePush(Queue*pq, QDataTypex);
// 队头出voidQueuePop(Queue*pq);
QDataTypeQueueFront(Queue*pq);
QDataTypeQueueBack(Queue*pq);
intQueueSize(Queue*pq);
boolQueueEmpty(Queue*pq);

Queue.c

#include "Queue.h"voidQueueInit(Queue*pq)
{
assert(pq);
pq->head=pq->tail=NULL;
}
voidQueueDestory(Queue*pq)
{
assert(pq);
QNode*cur=pq->head;
while (cur)
    {
QNode*next=cur->next;
free(cur);
cur=next;
    }
pq->head=pq->tail=NULL;
}
// 队尾入voidQueuePush(Queue*pq, QDataTypex)
{
assert(pq);
QNode*newnode= (QNode*)malloc(sizeof(QNode));
if (newnode==NULL)
    {
printf("malloc fail\n");
exit(-1);
    }
newnode->data=x;
newnode->next=NULL;
if (pq->tail==NULL)
    {
pq->head=pq->tail=newnode;
    }
else    {
pq->tail->next=newnode;
pq->tail=newnode;
    }
}
// 队头出voidQueuePop(Queue*pq)
{
assert(pq);
assert(pq->head);
// 1、一个// 2、多个if (pq->head->next==NULL)
    {
free(pq->head);
pq->head=pq->tail=NULL;
    }
else    {
QNode*next=pq->head->next;
free(pq->head);
pq->head=next;
    }
}
QDataTypeQueueFront(Queue*pq)
{
assert(pq);
assert(pq->head);
returnpq->head->data;
}
QDataTypeQueueBack(Queue*pq)
{
assert(pq);
assert(pq->head);
returnpq->tail->data;
}
intQueueSize(Queue*pq)
{
assert(pq);
intsize=0;
QNode*cur=pq->head;
while (cur)
    {
++size;
cur=cur->next;
    }
returnsize;
}
boolQueueEmpty(Queue*pq)
{
assert(pq);
returnpq->head==NULL;
}

层序遍历代码

voidLevelOrder(BTNode*root)
{
Queueq;
QueueInit(&q);
if (root!=NULL)
QueuePush(&q, root);
while (!QueueEmpty(&q))  //队列不为空则继续    {
BTNode*front=QueueFront(&q);
QueuePop(&q);
printf("%c", front->data);
if (front->left) //左边不为空        {
QueuePush(&q, front->left);
        }
if (front->right)
        {
QueuePush(&q, front->right);
        }
    }
printf("\n");
QueueDestory(&q);
}

main函数直接调用LevelOrder();即可,括号里面加一个根结点,比如A。

目录
相关文章
|
1月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
54 4
|
23天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
29天前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
24天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
56 1
|
1月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
132 8
|
2月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
2月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
2月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
61 4
|
2月前
|
C语言
C语言练习题代码
C语言练习题代码