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

目录
相关文章
|
13天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
62 8
|
1月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
1月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
1月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
2月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
47 4
|
1月前
|
C语言
C语言练习题代码
C语言练习题代码
|
2月前
|
存储 算法 C语言
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
|
2月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
|
2月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
2月前
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。