《二叉树》——3(层序遍历)

目录

前言:

层序遍历:

解析:


前言:

本文主讲链式二叉树的层序遍历,在前面的张篇blog我们初步实现了链式二叉树递归部分的内容,对于递归算法的学习和思维方式我们仍然需要不断加强,所以将对链式二叉树进行收尾,下一章我们将开启递归算法的题目强化训练。

层序遍历:

typedef struct BTTreeNode* QDataType;
//将链队列中的节点类型改为struct BTTreeNode(二叉树节点的数据类型)

void TreeLevelOrder(TreeNode* root)
{
	Queue q;
	QueueInit(&q);

	if (root == NULL)
	{
		printf("空树\n");
		exit(-1);
	}
	int levelsize = 1;
	QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		while (levelsize--)
		{
			TreeNode* front = QueueFront(&q);
			printf("%d ", front->data);
			if (front->left)
			{
				QueuePush(&q, front->left);
			}
			if (front->right)
			{
				QueuePush(&q, front->right);
			}
			
			QueuePop(&q);
		}
		printf("\n");
		levelsize = QueueSize(&q);
	}
	printf("\n");
	QueueDestroy(&q);
}

层序遍历不需要用到递归的思想,用我们之前学习过的队列的知识就可以实现层序遍历。

这里是用到队列的先进先出的特性。

以上是一颗二叉树,现在要实现该数的层序遍历,最终结果为:

1

2 4

3 5 6

解析:

    Queue q;
	QueueInit(&q);

	if (root == NULL)
	{
		printf("空树\n");
		exit(-1);
	}
	int levelsize = 1;
	QueuePush(&q, root);

 对于这一串代码,就是定义队列并且初始化,并将根节点入队列,再定义一个队列长度,用来接受队列里的节点数,当levelsize为空时,就代表当前层数的节点已经打印完毕。因为是将根节点入队列,而且第一层有且只有一个节点,即根节点,所以levelsize = 1;

while (!QueueEmpty(&q))
	{
		while (levelsize--)
		{
			TreeNode* front = QueueFront(&q);
			printf("%d ", front->data);
			if (front->left)
			{
				QueuePush(&q, front->left);
			}
			if (front->right)
			{
				QueuePush(&q, front->right);
			}
			
			QueuePop(&q);
		}
		printf("\n");
		levelsize = QueueSize(&q);
	}

 

目前的队列如上图所示。

首先我们需要将定义front指针指向队列的第一个元素。

此时我们需要将root的左右子树入队列,首先我们需要判断左右子树是否为空树。

如果不是空树就入队列。

则有:

 

而这个时候front指向的节点会被先打印出来,再出队列,这时候front就会指向下一个节点,并且levelsize也为0,因为这时候队列的首数据已经出队列,所以队列中只有两个数据,那么levelsize就会被赋值为2。

如图:

 

 同样,接下来就是判断front指向的节点的左右子树是否为空,不为空则入队列。

即:

由于levelsize为2,所以程序会打印队列的前两个数据,即24

2打印完后,front就会指向4这个节点,同样也会判断该节点的左右子树是否为空,不为空则入队列。

如图:

 

然后打印完4的节点后,levelsize又会被赋值为3,用来答应下一层的节点。

 

如此不断重复,层序遍历则完美实现。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/361514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker本地部署Firefox浏览器并结合内网穿透公网访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

Python pip 不是内部或外部命令...

文章目录 1 问题截图2 解决办法2.1 配置环境变量2.2 试试 pip3 3 扩展分析3.1 查询 Python 版本及位数3.2 查询 Python 安装路径3.3 查询当前 pip 的版本 1 问题截图 2 解决办法 2.1 配置环境变量 2.2 试试 pip3 根据安装的 Python 版本不同,使用的 pip 也会不同若…

ESP8266 AP配网

首先引入需要的库 #include <WiFiManager.h> // https://github.com/tzapu/WiFiManager 在setup() 方法中设置网络名称等待登录连接 void setup(){Serial.println("Wait for Smartconfig");WiFi.mode(WIFI_STA);WiFiManager wm;bool res;res wm.autoConnec…

基础小白快速入门python------Python程序设计结构,循环

循环在计算机中&#xff0c;是一个非常重要的概念&#xff0c;是某一块儿代码的不断重复运行&#xff0c;是一种逻辑思维 在编程中的体现&#xff0c;运用数学思维加代码结合加数据&#xff0c;就构成了一个循环。 在Python中&#xff0c;循环主要分为三大类 for循环 while循…

面试必考精华版Leetcode450. 删除二叉搜索树中的节点

题目&#xff1a; 代码&#xff08;首刷看解析&#xff09;&#xff1a; class Solution { public:TreeNode* deleteNode(TreeNode* root, int key) {if(rootnullptr){return nullptr;}if(root->val > key ){root->left deleteNode(root->left,key);return root;…

EXCEL VBA实现重复字段出现次数并列显示

EXCEL VBA实现重复字段出现次数并列显示 Sub dotest() Dim arr, dApplication.ScreenUpdating FalseSet d CreateObject("Scripting.Dictionary")With Sheets("Sheet2")r .Cells(.Rows.Count, "a").End(xlUp).Rowarr .[a1].Resize(r, 1)En…

幻兽帕鲁服务器多少钱?服务器租借价格一览表

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

福布斯财富增长榜前十富豪身价暴增3.5万亿!他们致富的秘诀究竟是?

按照《福布斯》最新的数据显示&#xff0c;今年全球前十位财富增长最多的富豪的身家总共增加了4900亿美元&#xff08;约3.5万人民币&#xff09;&#xff0c;大家可能对于3.5万亿没什么概念&#xff0c;但是换算一下&#xff0c;中国一共才14亿人&#xff0c;如果把这3.5万亿平…

测试环境搭建整套大数据系统(二:安装jdk,mysql)

一&#xff1a;安装JDK 参考 https://blog.csdn.net/weixin_43446246/article/details/123328558 二&#xff1a;安装mysql 1.因为我们安装cdh6.3.2。cdh支持的是5.6和5.7版本的mysql。 2. 步骤 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.…

基于Android的成人教育课程学习考试系统uniAPP的 小程序_12lo1

APP性能需求 &#xff08;1&#xff09;会员在安卓App页面各种操作可及时得到反馈。 &#xff08;2&#xff09;该平台是提供给多个会员使用的平台&#xff0c;会员使用之前需要注册登录。登录验证后&#xff0c;会员才可进行各种操作[10]。 &#xff08;3&#xff09;管理员用…

书写触感细腻的电容触控笔,透明造型超好看,西圣Pencil2上手

iPad在配上手写笔之后&#xff0c;才能才能充分发挥优势&#xff0c;实现除看视频之外的更多功能。很多人入手iPad的初衷都是工作或者学习&#xff0c;如果只拿来观剧或玩游戏就太浪费了。当然了&#xff0c;现实情况下&#xff0c;Apple Pencil高昂的定价也是很多人望而却步的…

Android组件化中的Arouter学习

假设现在有两个业务组件登录和问答模块之间需要进行通信&#xff0c;可能会想到用反射的方式&#xff0c;是可以但是会影响性能&#xff0c;而写的代码比较多类名这些要记清楚。 路由可以看做表&#xff0c;每个map对应一张表 我们可以试着这么写&#xff0c;完成MainActivity跳…

WINDOWS中电源设置小工具

你可以使用WinPowerSet&#xff0c;玩CS2之前&#xff0c;把电源设置为“高性能”&#xff0c;玩后设置为“平衡”。 WinPowerSet 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1iOp29c4ica9L47t_l9lZ2w?pwdd248 提取码&#xff1a;d248 最近新配了一台12…

由《幻兽帕鲁》私服漏洞引发的攻击面思考

《幻兽帕鲁》私服意外丢档 当了一天的帕鲁&#xff0c;回家开机抓帕鲁的时候发现服务器无法连接。运维工具看了下系统负载发现 CPU 已经跑满。 故障排查 登录服务器进行排查发现存在可疑的 docker 进程。 经过一番艰苦的溯源&#xff0c;终于在命令行历史中发现了端倪 攻击…

Java多线程--线程安全问题练习题

文章目录 &#xff08;1&#xff09;练习题1&#xff08;2&#xff09;练习题2&#xff08;3&#xff09;练习题3 现在咱们线程一共说了这么几件事情&#xff0c;如下&#xff1a; 具体文章见专栏。 接下来看几个练习题吧。 &#xff08;1&#xff09;练习题1 &#x1f30b;题…

实现单点登录

指再多系统应用群中登录一个系统&#xff0c;便可在其他所有系统中得到授权而无需再次登录&#xff0c;包括单点登录与单点注销两部分。 相比于单系统登录&#xff0c;sso需要一个独立的认证中心&#xff0c;只有认证红心能接受用户的用户名密码等安全信息&#xff0c;其他系统…

N65总账凭证管理凭证查询(sql)

--核算账簿 select code , name , pk_setofbook from org_setofbook where ( pk_setofbook in ( select pk_setofbook from org_accountingbook where 1 1 and ( pk_group N0001A11000000000037X ) and ( accountenablestate 2 ) ) ) order by code;--核算账簿 select code …

VMware虚拟机安装macOS

VMware虚拟机安装macOS 文章目录 VMware虚拟机安装macOS先看效果一、准备工作①&#xff1a;镜像资源下载②&#xff1a;虚拟机③&#xff1a;安装macOS所必要的插件 二、开始安装①&#xff1a;创建新的虚拟机②&#xff1a;自定义硬件③&#xff1a;开启虚拟机 先看效果 一、…

Packet tracer-实现VLAN内部通信

案例一&#xff1a; 要求PC1和PC2&#xff0c;PC3和PC4之间能够实现互访 两个VLAN&#xff0c;一个VLAN对应一个子网 以S2为例&#xff1a; 步骤 1&#xff1a;在 S2 上创建并命令 VLAN&#xff0c;把VLAN划分给活动的端口。 步骤 2&#xff1a;在 S3 上创建并命令 VLAN&…

在 WLC上配置WPA2-Enterprise WLAN

实验大纲 第1部分&#xff1a;创建一个新的WLAN 第1步&#xff1a;创建一个新的VLAN接口 第2步&#xff1a;配置WLC让它使用RADIUS服务器 第3步&#xff1a;创建一个新的WLAN 第4步&#xff1a;配置WLAN安全策略 第2部分&#xff1a;配置DHCP范围和SNMP 第1步&#xff1…