代码实现层序遍历二叉树(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。

目录
相关文章
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
226 4
|
6月前
|
存储 C语言
c语言——二叉树
二叉树的概念在这里就不进行过多的赘述,那么主要说一下我认为重要的部分,第一点就是二叉树里面部分概念的理解:就比如说,你对于如何构建二叉树,掌握的十分深刻,但刷题的时候对于一些题目所给的概念不清楚,导致看不明白题目,这课不好,二叉树的概念如下图所示,其实都很简单,主要是当给他的名字时,你明不明白。还有对于满二叉树与完全二叉树。
147 0
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
441 1
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
1001 8
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
210 2
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
192 2
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
107 0
深入C语言指针,使代码更加灵活(三)