二叉树层序遍历(c语言,非递归)

article/2025/9/18 18:16:33

        层序遍历的作用是将二叉树,从上到下,从左到右依次遍历。如下图遍历的结果是A->B->C->D->E->F->G->H。其实,这就相当于族谱一样,从辈分大到小遍历(从祖宗到孙子)狗头保命。

 那么,该如何实现呢,接下来我们运用队列的知识,用入队列,出队列的方式来解决。

目录

1.思路

2.具体实现

(1)准备步骤

(2)队列源码(Queue.h   和    Queue.c)

(3)层序遍历实现

(4)层序遍历源码

1.思路

(1)将A入队列

(2)判断队列是否为空,不为空就将A出队列,再将A的”孩子“入队列。

 (3)判空,将B出队列,将B的“孩子”入队列。

(4)判空,将C出队列,将C的“孩子”入队列。

 (5)判空,将D出队列,将D的“孩子”入队列(“孩子”为空则不进队列)

 。。。。。。。。(步骤同理)

(6)最后,队列为空结束遍历。

2.具体实现

(1)准备步骤

因为c语言不像c++一样有队列的库函数,所以就需要我们自己来实现一个队列。下面我给大家写了一个队列(才,才不是为了给你们用的呢.傲娇脸)。

(2)队列源码(Queue.h   和    Queue.c)

下面只有层序遍历要使用到的函数(绝对不是因为懒.jpg)

Queue.h

注意, 头文件一定要包含#include”tree.h",包含二叉树的“tree.h"以免下面定义队列元素出错(下面,会写"tree.h"文件的先不要着急。

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>#include"tree.h"//包含二叉树的“tree.h"以免下面定义队列元素出错typedef BTNode* Type;//定义队列中元素类型为二叉树节点类型typedef struct QueueNode
{struct QueueNode* next;Type data;
}Qnode;typedef struct Queue
{Qnode* head;Qnode* tail;int size;
}Queue;//初始化
void Queue_init(Queue* pq);
//入队列
void Queue_push(Queue* pq, Type x);
//出队列
void Queue_pop(Queue* pq);
//取队首
Type Queue_front(Queue* pq);
//判空
bool Queue_empty(Queue* pq);

 Queue.c

#include"Queue.h"//初始化
void Queue_init(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}
//入队列
void Queue_push(Queue* pq, Type x)
{assert(pq);Qnode* newNode = (Qnode*)malloc(sizeof(Qnode));if (newNode == NULL){perror("malloc");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;}pq->size++;
}
//出队列
void Queue_pop(Queue* pq)
{assert(pq);assert(!Queue_empty(pq));if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{Qnode* del = pq->head;pq->head = pq->head->next;free(del);del = NULL;}pq->size--;
}
//队首
Type Queue_front(Queue* pq)
{assert(pq);assert(!Queue_empty(pq));return pq->head->data;
}//判空
bool Queue_empty(Queue* pq)
{assert(pq);return pq->head == NULL && pq->tail == NULL;
}

(3)层序遍历实现

tree.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef char TreeType;typedef struct BinaryTreeNode
{TreeType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* TreeCreate();
// 二叉树销毁
void TreeDestory(BTNode* root);
// 层序遍历
void TreeLevelOrder(BTNode* root);

tree.c

注意,这里也一定要有#include“Queue.h",否则队列就无法正常使用。

我用了最粗暴的创建方法(让人见了直呼好家伙)

#include"tree.h"
#include"Queue.h"//构建二叉树 (最粗暴的创建方法)
BTNode* TreeCreate()
{BTNode* nA = (BTNode*)malloc(sizeof(BTNode));assert(nA);BTNode* nB = (BTNode*)malloc(sizeof(BTNode));assert(nB);BTNode* nC = (BTNode*)malloc(sizeof(BTNode));assert(nC);BTNode* nD = (BTNode*)malloc(sizeof(BTNode));assert(nD);BTNode* nE = (BTNode*)malloc(sizeof(BTNode));assert(nE);BTNode* nF = (BTNode*)malloc(sizeof(BTNode));assert(nF);BTNode* nG = (BTNode*)malloc(sizeof(BTNode));assert(nG);BTNode* nH = (BTNode*)malloc(sizeof(BTNode));assert(nH);nA->data = 'A';nB->data = 'B';nC->data = 'C';nD->data = 'D';nE->data = 'E';nF->data = 'F';nG->data = 'G';nH->data = 'H';nA->left = nB;nA->right = nC;nB->left = nD;nB->right = nE;nC->left = nF;nC->right = nG;nD->left = NULL;nD->right = NULL;nE->left = NULL;nE->right = nH;nF->left = NULL;nF->right = NULL;nG->left = NULL;nG->right = NULL;nH->left = NULL;nH->right = NULL;return nA;
}// 二叉树销毁
void TreeDestory(BTNode* root)
{if (root == NULL)return;TreeDestory(root->left);TreeDestory(root->right);free(root);
}// 层序遍历
void TreeLevelOrder(BTNode* root)
{Queue q;Queue_init(&q);if (root != NULL)Queue_push(&q, root);while (!Queue_empty(&q))//判空{BTNode* front = Queue_front(&q);//让front保存要出队列的节点Queue_pop(&q);printf("%c ", front->data);//下一层入队列(”孩子“入队列)if (front->left)Queue_push(&q, front->left);if (front->right)Queue_push(&q, front->right);}
}

(4)层序遍历源码

// 层序遍历
void TreeLevelOrder(BTNode* root)
{Queue q;Queue_init(&q);if (root != NULL)Queue_push(&q, root);while (!Queue_empty(&q)){BTNode* front = Queue_front(&q);Queue_pop(&q);printf("%c ", front->data);//下一层入队列if (front->left)Queue_push(&q, front->left);if (front->right)Queue_push(&q, front->right);}
}

 我的杀手皇后已经摸过了这篇文章了,当我按下按钮时,这篇文章将会爆炸。所以,还不快逃!!!!!☠️☠️☠️☠️


http://chatgpt.dhexx.cn/article/JBd3pPpJ.shtml

相关文章

二叉树层序遍历——java

目录 一、题目 二、层序遍历顺序 三、思路&#xff08;迭代法&#xff09; 四、代码实现 一、题目 1、链接&#xff1a;力扣 2、内容&#xff1a;给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&a…

力扣刷题之二叉树的层序遍历

Welcome to you, 每日一刷系列 二叉树的层序遍历 二叉树的层序遍历II 二叉树的右视图 二叉树的层平均值 N叉树的层序遍历 在每个树行中找最大值 填充每个节点的下一个右侧节点指针 填充每个节点的下一个右侧节点指针II 二叉树的最大深度 二叉树的最小深度 二叉树的层序…

C语言-二叉树的层序遍历

前言 承接上节&#xff0c;树的非递归三种遍历我们使用了栈&#xff0c;今天讲解的树的层序遍历&#xff0c;我们需要使用另外一种数据结构——队列 我们先简单的回忆一下什么是队列 1.队列 概念&#xff1a;一端入元素&#xff0c;另一端出元素的线性表 一端&#xff1a;队尾 …

二叉树层序遍历

二叉树层序遍历 给定一个二叉树&#xff0c;返回该二叉树层序遍历的结果&#xff0c;&#xff08;从左到右&#xff0c;一层一层地遍历&#xff09; 例如&#xff1a; 给定的二叉树是{3,9,20,#,#,15,7},该二叉树层序遍历的结果是 [ [3], [9,20], [15,7] ]提示: 0 < 二叉树的…

二叉树之层序遍历

遍历规则&#xff1a;二叉树的层次遍历就是按照从上到下每行&#xff0c;然后每行中从左到右依次遍历&#xff0c;得到的二叉树的元素值。 思路&#xff1a;对于层次遍历&#xff0c;我们通常会使用队列来辅助&#xff1a;因为队列是一种先进先出的数据结构&#xff0c;我们依…

【LeetCode】专题一 二叉树层序遍历

二叉树层序遍历 在本文中&#xff0c;我将会选取LeetCode上二叉树层序遍历的多道例题&#xff0c;并给出解答&#xff0c;通过多道题我们就可以发现&#xff0c;二叉树的层序遍历并不复杂&#xff0c;并且有着共通点。 102. 二叉树的层序遍历 给你二叉树的根节点 root &…

二叉树的层序遍历-Java

目录 一、题目描述 二、运行结果 三、解题思路 四、代码 一、题目描述 本文代码为力扣102题解题代码&#xff0c;也是通用的二叉树层次遍历代码&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访…

102 二叉树层序遍历

层序遍历&#xff0c;每次层的输出是是一个一维数组&#xff0c;整个二叉树的输出结果是二维数组 BFS遍历&#xff0c;依托于队列结构&#xff0c;每次在根节点出栈的时候&#xff0c;将其值加在结果列表中&#xff0c;然后将他的左右孩子节点入队列。 层序遍历相对于BFS&…

【LeetCode102. 二叉树的层序遍历】——层序遍历

102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示…

层序遍历总结

以 LeetCode102 作为例子&#xff1a; 题目描述 思路描述 层序遍历需要用到的数据结构是队列。需要考虑的问题是&#xff1a;如何标识当前节点的层数。 有以下三种方法&#xff1a; 方法 1 将每个节点表示为一个二元组 (node, level)&#xff0c;这种方法效率太低&#xff…

层序遍历?看这一篇就够了!

点关注不迷路 1.树的层序遍历 顾名思义&#xff0c;对于树型结构&#xff0c;层序遍历就是按层从上到下&#xff0c;每层按一定顺序对树的节点进行遍历。我们通过如图所示的二叉树进行说明&#xff1a;对于左边的二叉树&#xff0c;按层划分后可得到右边的分层结构。 如果按照…

二叉树遍历——层序遍历

目录 1.什么是层序遍历&#xff1f; 2.实现思路 3.代码实现 1.什么是层序遍历&#xff1f; 就是将一颗树按照每一层每一层的方式进行遍历 例如这棵树&#xff0c;进行层序遍历的结果应该是 那么我们该怎样去实现呢&#xff1f; 2.实现思路 利用队列先进先出的思想去实现 …

【二叉树 Java】二叉树的层序遍历

一、层序遍历定义&#xff1a; 按照每层进行遍历&#xff0c;从左至右&#xff0c;从上至下遍历树的节点&#xff0c;如下图所示 二、题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所…

二叉树----层序遍历

1.层序遍历 层序遍历:层序遍历即逐层按顺序遍历二叉树的各个节点,故层序遍历又叫广度优先遍历. 如图:广度优先遍历即按ABCDEFGH的顺序遍历 2.解题思路 1.这里我们利用队列先进先出的结构特点,当我们在队列中弹出一个树的节点时,我们便把树的左孩子和右孩子入到队列之中.(如果父…

二叉树的层序遍历

二叉树的层序遍历 1.层序遍历2.实例2.1二叉树的层序遍历2.2 二叉树的层序遍历 II2.3 二叉树的右视图2.4 二叉树的层平均值2.5 N叉树的层序遍历2.6在每个树行中找最大值2.7二叉树的最大深度2.8二叉树的最小深度2.9翻转二叉树2.10完全二叉树的节点个数2.11左叶子之和2.11找树左下…

二叉树的遍历——层序遍历

一、之前写了二叉树的三种遍历方法&#xff1a;有先序遍历、中序遍历、后序遍历&#xff0c;这三种方法都是用递归的方式来遍历二叉树的。层序遍历则不是使用递归来遍历&#xff0c;而是使用队列的来实现遍历&#xff1a; void LevelTreeOrder(BTNode* root) {Queue q;QueueIni…

【机器学习】LDA算法 (主题模型算法)

随着互联网的发展&#xff0c;文本分析越来越受到重视。由于文本格式的复杂性&#xff0c;人们往往很难直接利用文本进行分析。因此一些将文本数值化的方法就出现了。LDA就是其中一种很NB的方法。 LDA有着很完美的理论支撑&#xff0c;而且有着维度小等一系列优点。本文对LDA算…

LDA算法和PCA算法的总结(原理和思想)

LDA和PCA的对比(并没有公式推导&#xff0c;改日会写) 先补一补数学(不需要)&#xff1a; 方差——概率论和统计方差衡量随机变量或一组数据时离散程度的度量&#xff1b;概率论中方差用来度量随机变量和其数学期望之间的偏离程度。统计中的方差&#xff08;样本方差&#xff…

LDA算法原理及LDA与PCA的比较

1. LDA算法简介 LDA&#xff08;线性判别式分析 Linear Discriminant Analysis&#xff09;属于机器学习中的监督学习算法&#xff0c;常用来做特征提取、数据降维和任务分类。在人脸识别、人脸检测等领域发挥重要作用。LDA算法与PCA算法都是常用的降维技术。二者的区别在于&a…