《二叉树》——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,用来答应下一层的节点。

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微搭低代码从入门到精通03用户注册

文章目录 1 搭建数据源2 开发API3 搭建页面4 数据入库5 页面跳转总结 小程序开发中,如果定位是面向内部人员使用的应用,那么我们就需要仔细考虑用户鉴权的问题。首先需要提供用户注册的通道,让用户可以自主完成注册。其次要提供角色分配的功能…

力扣349两个数的交集

题目连接:349. 两个数组的交集 - 力扣(LeetCode) 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入: nums1 [1,2,2…

Android组件化中的Arouter学习

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

Kerberos 安全认证

什么是Kerberos Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。密码不在网络上传输,提高安全性。 简写名词 AS(Authentication Server) 认证服务器KDC(Key…

【原创】VMware创建子网,并使用软路由获得访问互联网的能力,并通过静态路由让上层网络访问位于虚拟机的子网

前言 一看标题就很离谱,确实内容也有点复杂,我的初衷是为后面搞软路由做准备,先通过VMware进行可行性验证,确定方案是否可行,再做下一步的计划。结论当然可以的,能通能访问,强的不行。 网络拓…

SV-7041T 多媒体教学广播IP网络有源音箱

SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可达到功率30W。同时它可以外接一个30W的无源副音箱,用在面积较大的场所。5寸进口全频低音喇…

蓝桥杯嵌入式第七届真题(完成) STM32G431

蓝桥杯嵌入式第七届真题(完成) STM32G431 题目 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**********************…

Origin 2022下载安装教程,操作简单,小白也能轻松搞定,附安装包,带软件使用教程

前言 Origin是一个科学绘图、数据分析软件,支持各种各样的2D/3D图形,包括统计,信号处理,曲线拟合以及峰值分析,Origin具有强大的数据导入功能和多样的图形输出格式。 准备工作 1、Win7及以上系统 2、提前准备好 Or…

2024西湖论剑misc方向wp

每年的misc都是最无聊坐牢的 数据安全-easy_tables import pandas as pd import hashlib from datetime import datetimeusers_df pd.read_csv(users.csv) permissions_df pd.read_csv(permissions.csv) tables_df pd.read_csv(tables.csv) actionlog_df pd.read_csv(acti…

vue使用json格式化

安装 npm i bin-code-editor -S // Vue2 npm install vue-json-viewer --save 在main.js引用 //引入bin-code-editor相关插件和样式 import CodeEditor from bin-code-editor; import bin-code-editor/lib/styles/index.css; import JsonViewer from vue-json-viewer //vue使用…

单片机驱动多个ds18b20

目录 1设计内容 2ds18b20介绍 2.1传感器引脚及原理图 2.2寄存器配置 3程序实现 3.1配置初始化 3.2配置寄存器 3.3ROM读取 3.4温度读取 1设计内容 通过51单片机,读取总线上挂载的多个ds18b20的温度信息。 如下图,成功读取到3路温度数据。 2ds18…

[docker] Docker容器服务更新与发现之consul

一、consul的相关知识 1.1 什么是注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#…

百度百舸平台的大模型训练最佳实践

今天的分享是百度智能云在 23 年夏季推出的「云智公开课 — AI 大底座系列」第 8 期,也是本次活动的最后一期。前面 7 期的内容,我的同事对大模型场景涉及到的各个模块,从网络、计算、存储、向量数据库、AI 框架、LMOps 等维度,为…

【网络奇遇记】探索网络世界的奥秘:计算机网络导论|章末总结

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️信息时代的计算机网络1.1 本文目录 二. ⛳️因特网的概述2.1 本文目录2.2…

Redis学习——高级篇⑥

Redis学习——高级篇⑥ Redis7高级之简单实现布隆过滤器BloomFilter (七) 7 布隆过滤器1. 是什么2.能干嘛3.实现原理和数据结构4.使用三步骤5.尝试手写简单的布隆过滤器,结合bitmap1.整体架构2.步骤设计3 springboot redis mybatis布…

springBoot - mybatis 多数据源实现方案

应用场景: 多数据源 小型项目 或者 大项目的临时方案中比较常用.在日常开发中,可能我们需要查询多个数据库,但是数据库实例不同,导致不能通过 指定schema的方式 区分不同的库, 这种情况下就需要我们应用程序配置多数据源 实现方式: 首先自定义实现 datasource数据源 为当前…

ASTORS国土安全奖:ManageEngine AD360荣获银奖

美国安全今日(AST)的年度“ASTORS”国土安全奖计划是一个备受瞩目的活动,致力于突显国土安全领域的创新与进步。这一奖项旨在表彰在保护国家免受安全威胁方面做出卓越贡献的个人和组织。该计划汇聚了执法、公共安全和行业领袖,不仅…

【Godot4自学手册】第十节将场景添加到TileSet绘制背景,主人公走到房子后面房子变得半透明

这节主要学习将场景添加到TileSet作为TileMap来搭建背景。同时,主人公进入房子后面,房子变得半透明,离开房子后房子变的不透明。 一、创建新场景 首先导入房子素材,最终文件系统内容如下: 点击新建场景按钮&#x…

MATLAB - 控制小车上的倒立摆

系列文章目录 前言 一、小车 - 摆杆 小车 - 摆杆模型如图 1 所示,使用 Simscape™ Multibody™ 在 Simulink 中建模。 图 1:小车上的倒立摆 图 2:Simscape 多体模型 该系统通过对小车施加可变力 进行控制。控制器需要在将小车移动到新位置或…

【LLM多模态】Cogview3、DALL-E3、CogVLM、CogVideo模型

note 文章目录 noteVisualGLM-6B模型图生文:CogVLM-17B模型1. 模型架构2. 模型效果 文生图:CogView3模型DALL-E3模型CogVideo模型网易伏羲-丹青模型Reference VisualGLM-6B模型 VisualGLM 是一个依赖于具体语言模型的多模态模型,而CogVLM则是…