IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树的层序遍历 -> 正文阅读

[数据结构与算法]二叉树的层序遍历

目录

二叉树层序遍历

分析

思路

图解

手动创建二叉树

层序遍历实现?

队列的实现

衔接问题

注意事项

连接

?队列头文件改变? ???


二叉树层序遍历

即设根节点所在层数为1,从第一层开始,从上往下,每层从左往右遍历。

分析

层序遍历需要用到队列,用其先进先出的性质

思路

当根不为空时,将根节点入队,

保存根节点地址,访问其数据域,之后出队;

若根节点的左子树不为空,入队左子树,

判断根节点的右子树不为空,入队右子树,

保存队头节点地址,访问其数据域,之后出队;

重复上述过程的条件是队列不为空

图解

?层序遍历过程分析:

手动创建二叉树

//定义
//.h文件
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;



//test.c文件
//开辟结点
BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;
	return node;
}

//手动创建
BTNode* CreatBinaryTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);
	BTNode* node7 = BuyNode(7);
	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node2->right = node5;
	node3->left = node6;
	node3->right = node7;
	
	return node1;
}

层序遍历实现?

// 层序遍历--使用队列
void LevelOrder(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
    //不为空则创建队列,初始化
	Queue q;
	QueueInit(&q);
	if (root)
	{
		QueuePush(&q, root);
	}
    //队列为空时,结束遍历
	while (!QueueEmpty(&q))
	{
		//保存起始节点
		BTNode* sta = QueueFront(&q);
		printf("%d ",sta->data);
		//出队--此时队头元素更新至下一位
		QueuePop(&q);
        //判断左右子树是否入队
		if (sta->left)
		{
			QueuePush(&q, sta->left);
		}
		if (sta->right)
		{
			QueuePush(&q, sta->right);
		}
	}

	//结束遍历记得销毁队列
	QueueDestory(&q);
}

队列的实现

博客链接看这儿:?队列的实现_i跑跑的博客-CSDN博客

衔接问题

注意事项

入队元素不是二叉树结点的数据域,是整个二叉树节点

那么在改变队列元素类型的时候:

要求队列元素为二叉树节点类型的指针,来接收节点地址?

连接

我们测试文件.c中需包含二叉树.h文件

.c中要创建队列,我们将队列.h文件放入二叉树.h文件中即可

队列.h文件中,元素类型须变为二叉树结构体的指针类型

那么我们直接包含二叉树的.h文件不就行了吗?

不行,会出现struct类型重定义的问题

那么不用包含二叉树头文件,我的队列头文件要怎么样才能访问到二叉树的结构体类型呢?

结构体声明即可

struct BinaryTreeNode;

?队列头文件改变? ???

//Queue.h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

//声明结构体类型
struct BinaryTreeNode;

//改变元素类型为该结构体类型的指针

typedef struct BinaryTreeNode* QDatatype;

//定义单链表结点
typedef struct QueueNode
{
	QDatatype data;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:40:34  更:2022-04-24 09:40:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:31:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码