二叉树层次遍历的C语言实现

news2024/9/20 8:03:30

二叉树


树是n个节点的有限集
每个节点事多有两颗子树的树称为 二叉树

二叉树的层次遍历


使用队列的数据结构,从树的根结点开始,依次将其左孩子和右孩子入队。而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果。
以下面数结构为例:


0入队 -- 0出队 1,2入队
         1出队 3,4入队
         2出队 5入队,只有一个右孩子,右孩子入队
         3出队 没有孩子,没有入队
         4出队 没有孩子,没有入队
         5出队 6入队,只有一个左孩子,左孩子入队
         6出队 没有孩子,没有入队
         队列中没有数据结束(队头和队尾重合)
         
因此最后的输出顺序为:0  1  2  3  4  5  6
         


构造二叉树的节点


    一个成员用来保存左侧子节点的地址
    一个成员用来保存右侧子节点的地址
    一个成员用来保存数据值。
    
    如果没有左节点或者右节点赋值为NULL

        

typedef struct node
{
	struct node *lchild;
	int data;
	struct node *rchild;
}NODE;

二叉树的构造

    // 根节点
	NODE root;
	
	// 定义6个节点 
	NODE n1;
	NODE n2;
	NODE n3;
	NODE n4;
	NODE n5;
	NODE n6;	
		
	
	// 构造二叉树 
	root.lchild = &n1;
	root.data = 0;
	root.rchild = &n2;
	
	n1.lchild = &n3;
	n1.data = 1;
	n1.rchild = &n4;
	
	n2.lchild = NULL;
	n2.data = 2;
	n2.rchild = &n5;
	
	n3.lchild = NULL;
	n3.data = 3;
	n3.rchild = NULL;
	
	n4.lchild = NULL;
	n4.data = 4;
	n4.rchild = NULL;
	
	n5.lchild = &n6;
	n5.data = 5;
	n5.rchild = NULL;
	
	n6.lchild = NULL;
	n6.data = 6;
	n6.rchild = NULL;

二叉树层次遍历的C语言实现

#include<stdio.h>

typedef struct node
{
	struct node *lchild;
	int data;
	struct node *rchild;
}NODE;

int main()
{	
	// 根节点
	NODE root;
	
	// 定义6个节点 
	NODE n1;
	NODE n2;
	NODE n3;
	NODE n4;
	NODE n5;
	NODE n6;
	
	// 定义队列
	NODE *queue[20];
	
	// 队头和队尾标记
	int front = 0;
	int rear = 0;
	
	// 每一次出队的成员
	NODE *p;	
	
	// 构造二叉树 
	root.lchild = &n1;
	root.data = 0;
	root.rchild = &n2;
	
	n1.lchild = &n3;
	n1.data = 1;
	n1.rchild = &n4;
	
	n2.lchild = NULL;
	n2.data = 2;
	n2.rchild = &n5;
	
	n3.lchild = NULL;
	n3.data = 3;
	n3.rchild = NULL;
	
	n4.lchild = NULL;
	n4.data = 4;
	n4.rchild = NULL;
	
	n5.lchild = &n6;
	n5.data = 5;
	n5.rchild = NULL;
	
	n6.lchild = NULL;
	n6.data = 6;
	n6.rchild = NULL;
	
	// 头结点入队 
	queue[rear++] = &root; 
	
	while(front < rear)
	{
		// 出队
		p = queue[front++];
		printf("%d ",p->data); 
		
		// 左右孩子入队	
		if(p->lchild != NULL)
		{
			queue[rear++] = p->lchild; 
		}
		
		if(p->rchild != NULL)
		{
			queue[rear++] = p->rchild; 
		}
	} 
	
	
	
	return 0;
}

运行结果:0 1 2 3 4 5 6


 

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

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

相关文章

Linux——死锁概念介绍和解决方式

目录 一.死锁概念介绍 二.死锁的解决方式 &#xff08;一&#xff09;.预防死锁 方式一&#xff1a;不请求 方式二&#xff1a;强制剥夺资源 方式三&#xff1a;线性分配资源 &#xff08;二&#xff09;.避免死锁&#xff1a;银行家算法 总体流程 安全性检查&#xf…

C语言---冒泡排序和快速排序

文章目录前言一、冒泡排序1.简介2.算法思路3.代码实现二、快速排序1.简介2.算法思路2.1左右指针法2.2挖坑法2.3前后指针法总结前言 交换排序有冒泡排序和快速排序这两种&#xff0c; 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两…

多目标跟踪:文献综述

文章目录摘要1、简介1.1、与其他相关综述的区别1.2、贡献1.3、综述的结构1.4. 外延2、 MOT问题2.1、问题公式化2.2、MOT的分类2.2.1、初始化方法2.2.2、处理方式2.2.3、输出类型2.2.4. 讨论3、MOT的组成3.1、外观模型3.1.1、视觉表征3.1.2. 统计测量3.2、运动模型3.2.1. 线性运…

安装httprunner manager遇到的坑

安装httprunner manager参考博客&#xff1a;https://www.cnblogs.com/MrqiuS/p/12944481.html安装mysqlclient报错Collecting mysqlclient1.3.12Downloading https://mirrors.aliyun.com/pypi/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/m…

maven利用springboot的配置文件进行多个环境的打包

在Spring Boot中多环境配置文件名需要满足application-{profiles.active}.properties的格式&#xff0c;其中{profiles.active}对应你的环境标识&#xff0c;可以随意命名&#xff0c;但要与pom文件中环境标识一样。至于哪个具体的配置文件会被加载&#xff0c;需要在applicati…

Docker系列 01

前言 学完这篇文章&#xff0c;你会知道Docker是什么&#xff1f;解决了什么问题以及如何安装Docker。在后续的系列文章中&#xff0c;我们会陆续介绍Docker的常用命令、镜像原理、Dockerfile以及网络管理等&#xff0c;让你对Docker有较为系统的认知&#xff0c;持续关注吧。 …

多继承的运用

//在封装一个领导类&#xff08;Leader&#xff09;:包括受保护成员&#xff1a;岗位、工资&#xff0c;完成其相关函数及show//由以上两个类共同把派生出学生干部类&#xff1a;引入私有成员&#xff1a;管辖人数&#xff0c;完成其相关函数以及show函数//在主程序中&#xff…

一刷代码随想录——动态规划

1.理论基础如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。对于动态规划问题&#xff0c;我将拆解…

24考研——高等数学的基础概念定理(一)——第一章|函数、极限、连续

今天考试&#xff0c;考定理&#xff0c;我是真没想到这些定理&#xff0c;脑袋瓜子嗡嗡的&#xff0c;害&#xff0c;废话少说&#xff0c;直接开干 文章目录一、基础概念定理1.1 收敛数列的性质&#xff08;唯一性、有界性、保号性、数列与子列关系&#xff09;1.2 函数极限的…

一款语文老师写的word办公神级插件

没错&#xff0c;正如题所说&#xff0c;这是一款语文老师开发的word办公神级插件----不坑盒子&#xff0c;小编体验了一下还真是太强大了&#xff01;双击exe文件&#xff0c;选择任意安装目录即可开始安装如果你的电脑缺少运行库&#xff0c;软件会自动帮你下载安装好安装完成…

QT模块化编程 pro pri 子工程 使用

如果工程过大时&#xff0c;就需要分子模块&#xff0c;Qt 也给我们提供了一种方式 Pri&#xff1b; 这里我们来看看Pri在项目中的使用&#xff0c;项目使用实际上也是很有主要可以模块清晰化&#xff0c;能提高程序的可扩展性。 网上这种写的很多&#xff0c;但少有写明白的&…

EGFR靶点药物研发进展-销售数据-上市药品前景分析

根据世界卫生组织的最新报告&#xff0c;与世界上其他癌症相比&#xff0c;肺癌导致的死亡率最高。非小细胞肺癌 (NSCLC) 约占肺癌病例总数的 85%。大量的风险因素归因于肺癌的发展&#xff0c;表皮生长因子受体 (EGFR) 是最常见的突变驱动基因之一&#xff0c;通过调节 PI3K/A…

Sentinel之授权规则与规则持久化

一、上集回顾上级文章地址&#xff1a;【SpringCloud】Sentinel 之隔离与降级_面向架构编程的博客-CSDN博客我们先来回顾一下Sentinel控制台上面的功能&#xff1a;所以&#xff0c;本章节就来研究 "授权规则"这一功能模块。二、授权规则授权规则可以对请求方来源做判…

XV6实验(2020)

XV6实验记录(2020) 环境搭建 参考连接 Lab guidance (mit.edu) 6.S081 / Fall 2020 (mit.edu) xv6 book中文版 Lab1:Xv6 and Unix utilities 实现几个unix实用工具&#xff0c;熟悉xv6的开发环境以及系统调用 Boot xv6 就是准备环境&#xff0c;克隆仓库&#xff0c;编…

代码随想录算法训练营第五十三天|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

一、1143.最长公共子序列 题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不…

Android 自定义控件

文章目录Canvas 画布类 画布背景 点 线 矩形 椭圆 圆 弧形 路径 字符 对画布裁剪及变形Paint 画笔类 常用方法 图形线条相关 字符相关 Path设置样式如果是一个自定义控件&#xff0c;则需要派生自 Vie…

【Vue】模板语法——内置指令

指令&#xff08;Directives&#xff09;是 vue 为开发者提供的模板语法&#xff0c;用于辅助开发者渲染页面的基本结构。vue 中的指令按照不同的用途可以分为如下几大类&#xff1a;① 内容渲染指令&#xff1a;v-text、v-html② 属性绑定指令&#xff1a;v-bind③ 事件绑定指…

<Java EE 进阶> 3.Spring简单的读和取

目录 1.存储Bean对象 &#xff08;1&#xff09;准备工作&#xff1a;配置扫描路径 &#xff08;2&#xff09;添加注解存储Bean对象 ① 类注解 ② 方法注解Bean 在String中更简单的存储和读取对象的核心是使用注解 1.存储Bean对象 &#xff08;1&#xff09;准备工作&am…

Linux内核的安装与加载

目录 一、tftp加载Linux内核和roootfs 二、 EMMC加载Linux内核和rootfs 三、tftp加载Linux内核nfs挂在根文件系统 四、EMMC加载uboot 一、tftp加载Linux内核和roootfs 这个就是Linux内核&#xff0c;它很轻量级只有2.949MB所以在嵌入式领域很受欢迎。 上面那个就是设备树文…

初识 Python 科学计算库之 NumPy(创建多维数组对象)

文章目录参考描述NumPy特点获取导入多维数组对象np.array()np.asarray()范围随机概览np.random.randn()np.random.normal()np.random.choice()np.random.random()np.random.randint()np.random.shuffle()np.random.seed()数列等差数列等比数列填充np.zeros()np.zeros_like()np.…