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

目录
相关文章
|
27天前
|
存储 编译器 C语言
【数据结构】C语言实现链队列(附完整运行代码)
【数据结构】C语言实现链队列(附完整运行代码)
36 0
|
27天前
|
存储 算法 程序员
【数据结构】C语言实现顺序表万字详解(附完整运行代码)
【数据结构】C语言实现顺序表万字详解(附完整运行代码)
39 0
|
1月前
|
算法 安全 C语言
使用C语言实现DES算法代码
使用C语言实现DES算法代码
|
1月前
|
C语言
C语言栈的括号匹配的检验讲解及相关代码
C语言栈的括号匹配的检验讲解及相关代码
33 0
|
1月前
|
算法 C语言
【C语言】三子棋游戏实现代码
【C语言】三子棋游戏实现代码
【C语言】三子棋游戏实现代码
|
1月前
|
C语言
C语言-------扫雷游戏的代码实现
C语言-------扫雷游戏的代码实现
27 0
|
1月前
|
C语言
嵌入式C语言中的工具代码助你一臂之力
嵌入式C语言中的工具代码助你一臂之力
21 0
|
1月前
|
C语言 数据安全/隐私保护 C++
嵌入式中如何把C++代码改写成C语言代码
嵌入式中如何把C++代码改写成C语言代码
31 0
|
1天前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
23天前
费马螺线在现实生活中的应用
费马螺线在现实生活中的应用
10 1