数据结构第十三弹---链式二叉树基本操作(上)

链式二叉树

  • 1、结构定义
  • 2、手动创建二叉树
  • 3、前序遍历
  • 4、中序遍历
  • 5、后序遍历
  • 6、层序遍历
  • 7、计算结点个数
  • 8、计算叶子结点个数
  • 9、计算第K层结点个数
  • 10、计算树的最大深度
  • 总结

1、结构定义

实现一个数据结构少不了数据的定义,所以第一步需要定义二叉树的机构。

typedef char BTDataType;//定义数据类型,可以根据需要更改

typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;//左指针
	struct BinaryTreeNode* right;//右指针
	BTDataType data;//存储数据
}BTNode;

2、手动创建二叉树

初次学习链式二叉树,对于创建一个二叉树较难理解,所以先手动创建二叉树,学习一些操作之后再来通过函数实现链式二叉树。

//创建结点函数
BTNode* BuyTree(BTDataType x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;

	return newnode;
}
//创建结点

	BTNode* A = BuyTree('A');
	BTNode* B = BuyTree('B');
	BTNode* C = BuyTree('C');
	BTNode* D = BuyTree('D');
	BTNode* E = BuyTree('E');
	BTNode* F = BuyTree('F');
//链接结点
	A->left = B;
	A->right = E;
	B->left = C;
	B->right = D;
	E->left = F;

在这里插入图片描述

3、前序遍历

前序遍历,又称先根遍历。
遍历顺序:根,左子树,右子树。

代码实现

void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%c ", root->data);//根
	PrevOrder(root->left);//左子树
	PrevOrder(root->right);//右子树
}

此处实现的遍历版本是将空指针也打印出来的版本,更适合新手理解
测试
在这里插入图片描述

4、中序遍历

中序遍历,又称中根遍历。
遍历顺序:左子树,根,右子树。

代码实现

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	InOrder(root->left);//左子树
	printf("%c ", root->data);//根
	InOrder(root->right);//右子树
}

测试
在这里插入图片描述

5、后序遍历

后序遍历,又称后根遍历。
遍历顺序:左子树,右子树,根。

代码实现

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	PostOrder(root->left);//左子树
	PostOrder(root->right);//右子树
	printf("%c ", root->data);//根
}

测试
在这里插入图片描述

6、层序遍历

层序遍历,自上到下,自左到右依次访问数的结点就是层序遍历。

思想(借助一个队列):
1、先将根节点入队,然后开始从队头出数据
2、出队头的数据同时将队头左右子树的结点入队(遇到NULL则不入队)
3、重复第二步,直到队列为空

在这里插入图片描述
代码实现

void LevelOrder(BTNode* root)
{
	Queue q;//创建爱你队列
	QueueInit(&q);//初始化队列
	if (root)//根节点不为空则入队
		QueuePush(&q, root);
	while (!QueueEmpty(&q))//队列不为空,循环继续
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);//出队
		printf("%c ", front->data);//打印数据

		if (front->left)//如果左子树不为空则入队
			QueuePush(&q, front->left);
		if (front->right)//右子树不为空入队
			QueuePush(&q, front->right);
	}

	QueueDestory(&q);//销毁队列
}

测试
在这里插入图片描述

7、计算结点个数

计算结点个数时,可以将问题拆成子问题
1、为空时,结点个数为0
2、不为空时,结点个数=左子树结点个数+右子树结点个数+1(根节点)

代码实现

int TreeSize(BTNode* root)
{
	return root==NULL?0:TreeSize(root->left) + TreeSize(root->right) + 1;
}

测试
在这里插入图片描述

8、计算叶子结点个数

计算叶子结点个数时,可以将问题拆成子问题
1、为空时,叶子结点个数为0
2、结点左右孩子为空时,叶子结点个数为1
3、结点不为空,叶子结点个数=左子树叶子结点个数+右子树叶子结点个数

代码实现

int TreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right==NULL)
	{
		return 1;
	}
	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

测试
在这里插入图片描述

9、计算第K层结点个数

计算第K层结点个数时,可以将问题拆分成子问题。
1、为空和非法时,结点个数为0个
2、为第一层时,结点个数为1个
3、不为空且合法时,第K层的结点个数=第K-1层的左子树结点个数+第K-1层的右子树结点个数

代码实现

//第k层结点的个数
int TreeKLevelSize(BTNode* root, int k)
{
	if (k < 1 || root == NULL)//空树或输入k值不合法
		return 0;
	if (k == 1)//第一层结点个数
		return 1;
  //不为空且合法时,第K层的结点个数=第K-1层的左子树结点个数+第K-1层的右子树结点个数
	return TreeKLevelSize(root->left, k - 1) + TreeKLevelSize(root->right, k - 1);
}

测试
在这里插入图片描述

10、计算树的最大深度

计算树的最大深度时,可以将问题拆成子问题
1、为空时,深度为0
2、不为空时,最大深度为左子树和右子树较大的深度+1(自己)

代码实现

int maxDepth(BTNode* root) {
	if (root == NULL)
		return 0;//为空,深度为0
	int leftDepth = maxDepth(root->left);//记录左子树最大深度
	int rightDepth = maxDepth(root->right);//记录右子树最大深度
    //不为空时,最大深度为左子树和右子树较大的深度+1(自己)
	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}

测试
在这里插入图片描述

总结

本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

龙芯3A5000上使用腾讯会议

原文链接&#xff1a;龙芯3A5000上使用腾讯会议 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在龙芯3A5000处理器上安装使用腾讯会议的经验分享。随着远程工作和在线会议的普及&#xff0c;腾讯会议成为了许多人日常工作不可或缺的工具。而对于使用龙芯3A5000…

HTTP 常见协议:选择正确的协议,提升用户体验(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Docker 镜像

1、联合文件系统 UnionFS&#xff08;联合文件系统)&#xff1a;Union文件系统〈UnionFS)是一种分层、轻量级并且高性能的文件系统&#xff0c;它支持对文件系统的修改作为一次提交来一层层的叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文件系统下(unite several dir…

C练习——汉诺塔

题目&#xff1a; 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源于印度一个古老传说。 大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆…

大模型在游戏行业的应用分析

文章目录 一、大模型作用1&#xff09;节省美术成本2&#xff09;模仿用户肖像&#xff0c;精准投放3&#xff09;买量流程的自动化4&#xff09;缩短视频素材制作周期5&#xff09;例如新营销形式宣传&#xff08;图生图&#xff09;5&#xff09;故事设计6&#xff09;辅助代…

品牌帮助中心:提升企业客户服务水平与效率的实用指南

什么是品牌帮助中心&#xff1f;简单来理解&#xff0c;他就是一种加速问题解决效率的方式&#xff0c;是通过在官网设置文章库或者社区的形式&#xff0c;为客户提供自助服务&#xff0c;自我查找问题答案。是一种既能提升问题解决效率&#xff0c;又能提升品牌形象的方式。接…

150套简约流行国内外优秀网页模板打包 /个人主页网站html模板 /html+css网页设计源码(分享)

这里把自己收藏的最新150套简约流行国内外优秀网页模板打包分享给大家&#xff0c;如果有用请点赞收藏&#xff0c;无密源码&#xff0c;直接拿来就可以用的。它是htmlcss网页设计源码&#xff0c;html5网页静态模板。 我分了品类&#xff0c;按行业或应用场景&#xff0c;不但…

什么是设备管理系统?设备管理系统解决方案有何优势?

随着企业规模的不断扩大以及设备功能增加以及复杂性&#xff0c;对设备的管理提出新的挑战。由此各设备管理系统随即涌入市场。设备管理系统是对设备的运行情况、维修情况等进行记录并快速维修&#xff0c;达到提高设备维修效率&#xff0c;优化设备生命周期的综合性解决方案系…

Unity填坑-灯光烘焙相关

Unity填坑-灯光烘焙相关 文章目录 Unity填坑-灯光烘焙相关前言一、Light的模式二、光的效果分类三、各种Light模式与烘焙的说明1.Realtime,实时光2.baked,烘焙光3.mixed,混合 四、实时全局光五、其他说明1.动态物体的全局光照效果2.手机使用烘焙注意的点3.其他设置 前言 项目组…

Vscode中的node.js的安装与使用

前往官网下载安装包 Node.js 中文网 选择较为稳定的版本 安装全选下一步就好了&#xff0c;这里可以选择配置环境变量是否自动启动node.js 在控制台输入指令如果出现了版本号就代表成功了

SQL:一行中存在任一指标就显示出来

当想要统计的两个指标不在一张表中时&#xff0c;需要做关联。但很多情况下&#xff0c;也没有办法保证其中一张表的维度是全的&#xff0c;用left join或right join可能会导致数据丢失。所以借助full join处理。 1&#xff09;如&#xff0c;将下面的数据处理成表格中的效果&…

API Monitor简易使用教程 监控Windows dll调用 监控Windows API调用 查看函数名,参数类型,参数,返回值

先看效果&#xff0c;可以显示所有dll及windows api的指定函数调用&#xff0c;以及传递的参数查看与修改。 官网下载 也有教程 我验证使用方法 1、API Filter窗口&#xff1a;选定要监听的dll函数或windows API&#xff0c;可以打断点 选中并右键勾上Breakpoint 选 Before C…

公司运营数据分析大屏:引领企业决策,驱动业务增长

在数字化时代&#xff0c;数据已经成为企业决策的关键。为了更好地洞察市场趋势、优化业务流程、提升运营效率&#xff0c;越来越多的企业开始引入数据分析大屏以分析公司运营状况。这一创新举措不仅改变了传统的管理模式&#xff0c;更引领企业迈向智能化决策的新篇章。 公司运…

python_selenium零基础爬虫学习案例_知网文献信息

案例最终效果说明&#xff1a; 去做这个案例的话是因为看到那个博主的分享&#xff0c;最后通过努力&#xff0c;我基本实现了进行主题、关键词、更新时间的三个筛选条件去获取数据&#xff0c;并且遍历数据将其导出到一个CSV文件中&#xff0c;代码是很简单的&#xff0c;没有…

automa插件使用的一些实战经验2

automa的工程还是要经常导出备份&#xff0c;因为经常出现突然模块消失的情况。 1 滑动分页条件区分 传统的页面都是有分页标签&#xff0c;这样你很容易知道&#xff0c;应该用分页来做。但是现在手机端的应用基本都是上滑就可以分页&#xff0c;再混合式开发的环境下&#xf…

Maven多模块项目打包:Unable to find main class

目录 一、错误来源 二、原始pom文件 common模块 pojo模块 server模块 父工程 三、解决方法 四、修改pom文件 common模块 pojo模块 server模块&#xff08;不改动&#xff09; 父工程 一、错误来源 使用Maven对项目进行多模块开发&#xff0c;在项目打包时出现错误…

c++算法之枚举

目录 解空间的类型 循环枚举解空间 例题 特别数的和 输入格式 输出格式 输入样例&#xff1a; 输出样例&#xff1a; 解 例题 反倍数 问题描述 输入格式 输出格式 样例输入 样例输出 解 例题 找到最多的数 解 枚举算法是一种基本的算法思想&#xff0c;它通过…

linux软件安装(yum命令)

1.Linux系统的应用商店 操作系统安装软件有许多种方式&#xff0c;一般分为&#xff1a; 下载安装包自行安装 如win系统使用exe文件、msi文件等如mac系统使用dmg文件、pkg文件等 系统的应用商店内安装 如win系统有Microsoft Store商店如mac系统有AppStore商店 Linux命令行…

中科星图——Landsat9_C2_SR大气校正后的地表反射率数据

数据名称&#xff1a; Landsat9_C2_SR 数据来源&#xff1a; USGS 时空范围&#xff1a; 2022年1月-2023年3月 空间范围&#xff1a; 全国 数据简介&#xff1a; Landsat9_C2_SR数据集是经大气校正后的地表反射率数据&#xff0c;属于Collection2的二级数据产品&#…

Consider defining a bean of type ‘XXXX‘ in your configuration.

今天学习尚硅谷的SpringCloud时&#xff0c;发现支付模块无法启动&#xff0c;控制台输出下面的错误: 看起来可能是dao层没有被注入。 然后根据我已有的知识&#xff0c;我检查了注解Mapper Mapper public interface PaymentDao {public int create(Payment payment);public…