数据结构之链式二叉树续

news2025/1/19 14:28:57

1.获取叶节点个数

获取叶子结点个数,我们这里也用递归的方法

利用分治思想去解决这个问题

●代码思想:

1. 当遇到空树或者遇到空的节点时,也就是说这是的叶子为NULL,这是我们返回0

2. 当遇到左节点或者右节点为空,当节点不为空时,此时已经到达了叶子结点,所以返回1

3. 当遇到的不是叶节点时,我们需要到递归左节点的个数和右节点的个数,并进行递归返回

●代码思想:

对于整棵树来说,当我们遇到空树或者遇到节点为空的时候,这时的叶子结点为空,我们这时返回0,当不是上中情况的时候,我们从根往下去搜索,先搜索左节点,当左节点不为空,并且左节点的左子树和右子树都是空的时候,这时候就可以确定它是叶子了,也就是返回1,当搜索完左子树就可以搜索右子树,右子树也同理 

2.获取树的高度 

获取树的高度,我们也是利用分治的思想去实现这个代码

首先就是当我们要想返回高度的时候,我们需要调用到左右子树的高度

然后比较左右子树的高度,比较出最大的一个并返回

然后加1(因为我们递归的是左右子树的高度,我们需要整个树的高度,所以还需要加上根,也就是加一)

●代码思想:

1.当我们遇到空树或者遇到的节点为NULL,这时返回0

2.然后接下来去递归左子树和右子树

3.返回时,如果左子树大于右子树,那么就是左子树高度+1,否则右子树高度+1

//获取树的高度
int TreeHeight(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	TreeHeight(root->left);
	TreeHeight(root->right);

	return (TreeHeight(root->left) > TreeHeight(root->right) ? TreeHeight(root->left) : TreeHeight(root->right)) + 1;
}

但这个代码有一定的缺陷

我们可以看到,这个代码我们调用了两次TreeHeight(root->left)和TreeHeight(root->right)

在这一树中,我们调用多次函数,大大增加了计算的难度,在一棵小树中可能不明显,可当树更大时,这时候弊端就先显示出来了

所以我们可以改进一下代码,定义两个变量去接受返回值

然后比较两个返回值

//改进代码
int TreeHeight(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	/*TreeHeight(root->left);
	TreeHeight(root->right);

	return (TreeHeight(root->left) > TreeHeight(root->right) ? TreeHeight(root->left) : TreeHeight(root->right)) + 1;*/
	int Heightleft = TreeHeight(root->left);
	int Heightright = TreeHeight(root->right);

	return (Heightleft > Heightright ? Heightleft : Heightright + 1);
}

3.计算第K层节点个数 

计算k层节点的个数,我们可以看成计算左节点的(k-1)层和右节点(k-1)层的节点个数

因为我们不算顶部节点所以应该是k-1

●代码思想:

首先是如果是空树或者当遇到叶子结点外的空节点时,返回0

当遇到k为1的时候,这时只有一个根,也就返回1

其余情况均利用递归思想,去递归左右子树,注意此时的k应该变成k-1

//计算树k层的节点个数
int TreeKCount(BTNode* root, int k)
{
	if (root == NULL || k < 1)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return TreeKCount(root->left, k - 1) + TreeKCount(root->right, k - 1);
}

4.寻找某个节点 

寻找某个节点的话,我们也利用递归的方法,分治的思想去解决这个问题

寻找某个节点,那么这个节点如果不在根上,那么就在根的左子树和右子树上

那么就想下寻找

下边的节点也可以分为左子树和右子树和根

依次进行,就形成了递归

//寻找某个节点
BTNode* TreeFind(BTNode* root, int x)
{
	if (root == NULL)
	{
		return 0;
	}
	if (x == root->val)
	{
		return root;
	}
	TreeFind(root->left, x);
	TreeFind(root->right, x);
    return NULL;
}

很多人可能会想到这样的代码

可当我们去运行的时候,我们会发现找不到,不管x为多少都找不到

为什么呢?

原因是我们没有东西去接收

当我们找到的时候,我们递归需要往上递归

可上边的栈中没有可以接受的变量值

所以我们最终遍历完整棵树也找不到我们想找的节点

所以改一下代码

//寻找某个节点
BTNode* TreeFind(BTNode* root, int x)
{
	if (root == NULL)
	{
		return 0;
	}
	if (x == root->val)
	{
		return root;
	}
	BTNode* ret1 = TreeFind(root->left, x);
	BTNode* ret2 = TreeFind(root->right, x);
	if (ret1)
		return ret1;
	if (ret2)
		return ret2;
	return NULL;
}

这样我们利用新建立的节点去接受我们的左右子树的数据

然后如果不为空就不断返回,为空那么就返回0

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

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

相关文章

精酿啤酒与咖喱饭的异国风味

当醇厚的Fendi Club啤酒与香浓的咖喱饭相遇&#xff0c;一场味蕾的异国之旅就此展开。Fendi Club啤酒以其与众不同的麦香和细腻的泡沫&#xff0c;为咖喱饭增添了别样的风味&#xff0c;而咖喱饭的香辣与丰富口感&#xff0c;又为啤酒带来了更多的层次感。 Fendi Club啤酒&…

docker的常用指令

docker的常用指令 从docker镜像仓库&#xff0c;搜索所有和mysql有关的镜像 docker search mysql 从docker仓库拉取mysql docker pull mysql这里的mysql是指使用search搜索出来的所有容器的NAME 如果和我一样遇到以下问题&#xff1a; 我可以登录阿里云的官网&#xff0c;找…

点成分享 | 了解您的健康指标:血细胞沉降率(ESR)

一、背景介绍 当我们在体检或进行临床血液检验时&#xff0c;时常会在检验单上看到这样一个指标&#xff1a;ESR。 有时检验单上只有一个简单的箭头&#xff0c;那么这个结果代表什么含义呢&#xff1f;这个指标又能如何反映我们的健康状况呢&#xff1f; 今天点成生物就带大…

Mysql 无法启动,mysql-bin.日志丢失删除处理

在linux操作系统中&#xff0c;当mysql无法启动时候&#xff0c;先看日志 2024-03-15T05:20:16.352075Z 0 [Warning] [MY-000081] [Server] option max_allowed_packet: unsigned value 107374182400 adjusted to 1073741824. 2024-03-15T05:20:16.352156Z 0 [Warning] [MY-010…

三种方式使用纯 CSS 实现星级评分

本文介绍三种使用纯 CSS 实现星级评分的方式。每种都值得细品一番~ 五角星取自 Element Plus 的 svg 资源 <svg xmlns"http://www.w3.org/2000/svg" viewBox"0 0 1024 1024" style""><pathfill"currentColor"d"M283.84 …

ctfshow-XXE(web373-web378)

目录 XXE&#xff08;外部实体注入攻击&#xff09; web373 web374 web375 web376 web377 web378 知识点 XXE&#xff08;外部实体注入攻击&#xff09; XXE这几关有个前提flag在根目录下文件名为flag web373 <?php error_reporting(0); libxml_disable_entity_…

定制红酒:定制流程中的专业建议与指导,帮助客户做出理想选择

在云仓酒庄洒派&#xff0c;云仓酒庄洒派深知消费者在定制红酒时可能会面临诸多选择和困惑。因此&#xff0c;云仓酒庄洒派提供专业的建议和指导&#xff0c;帮助消费者在定制流程中做出理想选择。 云仓酒庄洒派的专业团队会为消费者提供红酒品种和产区的举荐。云仓酒庄洒派会根…

基于udp协议的网络通信(windows客户端版+简易聊天室版),重定向到终端

目录 和windows通信 引入 思路 WSADATA 代码 运行情况 简单的聊天室 思路 重定向 代码 terminal.hpp -- 重定向函数 服务端 客户端 运行情况 和windows通信 引入 linux和windows都需要联网,虽然他们系统设计不同,但网络部分一定是相同的,所以套接字也是一样的 这…

Diffblue生成单元测试

什么是Diffblue Diffblue Cover 是一个强化学习 AI 平台&#xff0c;可自动编写全面的、类似人类的 Java 单元测试&#xff0c;从而节省开发人员时间、提高测试覆盖率并降低回归风险。Cover 以 IntelliJ IDE 插件&#xff08;Cover Plugin&#xff09;、CLI 应用程序&#xff…

中等职业学校人工智能技术与应用(710212)专业解决方案

一、专业背景 1.1人工智能确立为国家战略 近年来&#xff0c;人工智能技术取得了显著进展&#xff0c;不仅在理论层面有所突破&#xff0c;更在实际应用中展现出强大的潜力和价值。其发展趋势日益明显&#xff0c;展现出多方面的特点。“深度学习”与“大数据”的结合成为当前…

QT信号与槽实现方式

1、第一种实现方式 在QT开发工具UI界面先拖入按钮&#xff0c;然后鼠标右键拖入按钮&#xff0c;点击选中槽&#xff0c;在页面选着需要的信号&#xff0c;然后OK&#xff0c;随即将会跳转到类的.cpp文件&#xff0c;&#xff08;这种UI代码结合的方式&#xff0c;会自动去绑定…

力扣101---对称二叉树(简单题)

题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 非递归Java代…

Jenkins cron定时构建触发器

from&#xff1a; https://www.jenkins.io/doc/book/pipeline/syntax/#cron-syntax 以下内容为根据Jenkins官方文档cron表达式部分翻译过来&#xff0c;使用机翻加个人理解补充内容&#xff0c;包括举例。 目录 介绍举例&#xff1a;设置方法方法一&#xff1a;方法二&#xf…

通过简单的案例入门Mybatis~

目录 一.概述 二.JDBC的缺点 三.案例 1.创建测试类 2.加载Mybatis核心配置文件获取SqlSessionFactory 3.获取SqlSession对象 4.执行sql 5.释放资源 一.概述 Mybatis是一款持久层框架&#xff0c;用于简化JDBC开发。所谓框架&#xff0c;就是一个半成品软件&#xff0c;…

Redis管道和发布订阅

解决思路 类似mset打包批量处理 定义&#xff1a;Pipeline是为了解决RTT往返时延&#xff0c;仅仅将命令打包一次性发送&#xff0c;对Redis的执行不造成其他影响 需要把批量执行的命令都放到文件里面 命令解释 上一条命令的结果作为参数 通过Linux命令的管道 传输给管道后面…

Java代码基础算法练习---2024.3.14

其实这就是从我学校的资源&#xff0c;都比较基础的算法题&#xff0c;先尽量每天都做1-2题&#xff0c;练手感。毕竟离我真正去尝试入职好的公司&#xff08;我指的就是中大厂&#xff0c;但是任重道远啊&#xff09;&#xff0c;仍有一定的时间&#xff0c;至少要等我升本之后…

OCR文字识别训练数据整理的关键步骤和注意事项

在开发OCR文字识别产品时&#xff0c;为了确保准确性和可靠性&#xff0c;需要精心整理训练数据。特别是针对合同、证件、票据等文档类型&#xff0c;更需要有针对性地准备文字语料库。以下是针对OCR文字识别训练数据整理的一些建议&#xff1a; ### 整理训练数据的步骤&#…

使用kill()函数向进程发送信号

本片文章的学习记录总结来源于&#xff1a;https://www.bilibili.com/cheese/play/ep182660?csourcecommon_hp_history_null&t11&spm_id_from333.1007.top_right_bar_window_history.content.click 通常在Linux系统中&#xff0c;可以使用 kill or killall 命令向指定…

如何保证Redis和数据库数据一致性

缓存可以提升性能&#xff0c;减轻数据库压力&#xff0c;在获取这部分好处的同时&#xff0c;它却带来了一些新的问题&#xff0c;缓存和数据库之间的数据一致性问题。 想必大家在工作中只要用了咱们缓存势必就会遇到过此类问题 首先我们来看看一致性&#xff1a; 强一致性…

使用SpaceDesk实现iPad成为电脑拓展屏(保姆级教程)

使用SpaceDesk实现iPad成为电脑拓展屏 SpaceDesk是一个开源的软件, 所以说对学生和平民用户非常的友好, 连接后的画质也非常不错, 而且具有无线和有线两种连接方式. 接下来就开始教程: 1. 安装SpaceDesk电脑版 首先我们要下载SpaceDesk电脑版安装好: SpaceDesk官网 注意: …