首页 > 其他分享 >二叉树的广度优先遍历

二叉树的广度优先遍历

时间:2023-07-28 22:03:41浏览次数:45  
标签:遍历 struct 队列 层序 二叉树 front 广度 root

二叉树的广度优先遍历

层序遍历

设二叉树的根节点所在层数为第一层,层序遍历就是从二叉树的根节点出发,先访问第一层的根节点,然后从左到右访问第2层上的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

image-20230710211726233

要想用代码实现队列的层序遍历我们需要借助队列:

1、先把根结点入队列,然后开始从队头出数据;

2、出队头的数据,把它的左孩子和右孩子依次从队尾入队列(NULL不入队列);

3、重复进行操作2,直到队列为空为止。

image-20230710212919158

借助队列先进先出的特性,上一层数据出队列的时候将下一层数据带入到队列中。

代码:

//层序遍历
void LevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);//队列初始化
	if (root != NULL)
	{
		QueuePush(&q, root);//将根结点插入
	}
	while (!QueueEmpty(&q))//如果队列不为空
	{
		//读取队头元素
		BTNode* front = QueueFront(&q);
		//删除队头元素
		QueuePop(&q);
		//打印队头元素
		printf("%d ", front->data);
		//如果左孩子不为空,插入左孩子结点
		if (front->left)
		{
			QueuePush(&q, front->left);//将左结点插入
		}
		if (front->right)
		{
			QueuePush(&q, front->right);//将右节点插入
		}
	}
	QueueDestroy(&q);//销毁队列
}

测试前中后序遍历和层序遍历:

//队列结构体的声明和定义
struct BinaryTreeNode;
typedef struct BinaryTreeNode* QDataType;
typedef struct QueueNode
{
	QDataType val;
	struct QueueNode* next;
}QNode;
typedef struct Queue {
	QNode* head;
	QNode* tail;
	int size;
}Queue;
//测试
int main()
{
	BTNode* root = CreatBinaryTree();
	PrevOrder(root);//输出1 2 3 4 5 6
	printf("\n");
	InOrder(root);//输出3 2 1 5 4 6
	printf("\n");
	PostOrder(root);//输出3 2 5 6 4 1
	printf("\n");
	LevelOrder(root);//输出1 2 4 3 5 6
	printf("\n");
}

标签:遍历,struct,队列,层序,二叉树,front,广度,root
From: https://blog.51cto.com/u_15562309/6887631

相关文章

  • 101. 对称二叉树
    给你一个二叉树的根节点 root ,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#s......
  • 二叉树某个节点的深度
    微信公众号:码云成化关注可了解更多的教程及进阶技巧。问题或建议,请公众号留言;如果你觉得阿云对你有所帮助,欢迎赞赏深度的定义[当前结点的层数。默认叶子节点是null节点,深度是0。其子节点是null节点,深度是1。]普通二叉树给出上图一个普通二叉树,如果计算结点深度,......
  • 03-二叉树的遍历
    二叉树的遍历定义:遍历是数据结构中的常见操作把所有元素都访问一遍线性数据结构的遍历比较简单分为:正序遍历和逆序遍历根据结点访问顺序的不同,二叉树的常见遍历方式有4种前序遍历(PreorderTraversal)中序遍历(inorderTraversal)后序遍历(PostorderTraversal)层序遍......
  • jquery 遍历tr
    Jquery遍历tr的实现方法作为一名经验丰富的开发者,我会教你如何使用jQuery遍历<tr>元素。在这篇文章中,我们将会使用以下步骤来实现目标:获取<table>元素遍历<tr>元素在循环中执行操作下面是每个步骤需要完成的具体操作,以及对应的代码和注释。步骤一:获取<table>元素首先,我们......
  • uva 784 Maze Exploration(DFS遍历图)
                            uva784MazeExplorationmaze(迷宫)ofrectangular(矩形的)roomsisrepresentedonatwodimensional(空间的)gridasillustrated(阐明)infigure1a.Eachpointofthegridisrepresentedbyacharacter.Thepoint......
  • TypeScript小知识:遍历enum (暂时记录)
    enumBlockPrefab{  BLOCK2=0,  BLOCK4,  BLOCK8,  BLOCK16,  BLOCK32,  BLOCK64,  BLOCK128,  BLOCK256,  BLOCK512,  BLOCK1024,  BLOCK2048}letnum=BlockPrefab.BLOCK128;letsmth=BlockPrefab[num];let......
  • Redis的有序集合Zset为啥用跳表不用二叉树
    跳表和红黑树查找的时间复杂度都是logN,插入删除也是logN。范围查找貌似也都是O(k+logn),其中n是树中节点的数量,k是满足范围条件的节点数量。但是实现起来跳表要简单很多。1.zset有个很核心的操作叫范围查找,我们要查找某个范围区间的元素。跳表可以做到logN时间复杂度内的快......
  • 剑指offer--二叉树
    第3题:二叉搜索树的第k个节点描述给定一棵结点数为n的二叉搜索树,请找出其中的第k小的TreeNode结点值。返回第k小的节点值即可不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1保证n个节点的值不一样思路递归中序遍历二叉搜索树:左子树的元素都小于根节点,右......
  • python字典遍历时删除元素
    Python字典遍历时删除元素在Python编程中,字典(dictionary)是一种非常有用的数据类型。它以键值对(key-valuepair)的形式存储数据,其中每个键(key)都是唯一的。字典可以用于存储大量数据,并且可以根据键快速查找对应的值。然而,在对字典进行遍历的过程中,我们需要注意一些问题,尤其是在删除元......
  • 树与二叉树知识梳理
    树与二叉树知识梳理目录树与二叉树知识梳理树树的定义树的常用名词有序树和无序树树的存储父亲表达法思路代码孩子兄弟表达法思路代码树的遍历先根遍历后根遍历层次遍历二叉树二叉树的定义二叉树的性质满二叉树满二叉树的定义完全二叉树完全二叉树的定义二叉树的存储父亲表示法孩......