二叉树节点相关算法题|双分支节点个数|所有左叶子之和|每一层节点平均值(C)

news2024/12/24 5:03:04

双分支节点个数

假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算一棵给定二叉树的所有双分支节点个数

算法思想

计算一棵二叉树中所有双分支节点个数的递归模型
若树为空,结果为0
若当前节点为双分支节点,递归左右孩子,并且+1
若是其他情况,当前节点是单分支节点或叶节点

int DsonNode(BTNode* root)
{
	BTNode* cur = root;
	if (cur == NULL)
		// 空树返回0
		return 0;
	// 判断当前节点是否有两个子节点
	if (cur->left != NULL && cur-right != NULL)
		// 计数+1
		return DsonNode(cur->left) + DsonNode(cur->right) + 1;
	else
		// 不符合条件,仅递归左右子树
		return DsonNode(cur->left) + DsonNode(cur->right);
}

所有左叶子之和

计算给定二叉树的所有左叶子之和

算法思想
  • 递归遍历树:
    • 从根节点出发,沿着树的左右分支递归访问所有节点。
    • 递归过程中,判断每个节点是否为左叶子节点。
  • 累加左叶子节点的值:
    • 如果节点满足条件,则将其值累加到最终结果中。
      递归所有节点,先标记左节点,flag=true,然后如果满足条件,也就是左右孩子为空,即是左叶子节点
int leaf(BTNode* root, bool flag)
{
	if (root == NULL)
		return 0;
	// 如果是左叶子节点
	if (flag == true && root->left == NULL && root->right == NULL)
		return root->val;
	// 递归处理左右子树
	return leaf(root->left, true) + leaf(root->right, false);
}
int sumOfLeftLeaves(BTNode* root)
{
	if (root == NULL)
		return 0;
	return leaf(root, false);
}
  1. 函数 leaf:
    • 参数说明:
      • BTNode root:当前节点。
      • bool flag:标志变量,指示当前节点是否是左子节点。
    • 功能:
      • 如果当前节点为空,返回 0。
      • 如果当前节点是左叶子节点(即 flag == true 且没有左、右子节点),返回该节点的值。
      • 否则递归计算左子树和右子树的结果,分别传递 true 和 false 给左子树和右子树。
    • 返回值:所有符合条件的左叶子节点值的和。
  2. 函数 sumOfLeftLeaves:
    • 参数说明:
      • BTNode* root:树的根节点。
    • 功能:
      • 如果根节点为空,直接返回 0。
      • 调用辅助函数 leaf,从根节点开始递归计算。
    • 返回值:整棵树中左叶子节点的值的总和。

每一层节点平均值

给定一个非空二叉树的根节点root,以数组的形式返回每一层节点的平均值

算法思想

使用深度优先搜索计算二叉树的层平均值,需要维护两个数组,counts数组用于存储二叉树的每一层的节点数,sums用于存储二叉树的每一层的节点值之和。
搜索过程中需要记录当前节点所在层,如果访问到的节点在第i层,则将counts的i的值+1,并将该节点值加到sums的i。
遍历结束之后,第i层的平均值即为sums的i除以counts的i

  • 深度优先搜索(DFS):
    • 遍历树的每一层,将每层的节点值累计到对应的数组中。
    • 同时记录每层的节点个数。
  • 结果计算:
    • 遍历存储的总和值和节点个数,计算每层的平均值。
      ![[Pasted image 20241210230316.png]]
  1. 初始的时候
    counts数组和sums数组都是0,countsSize和sumsSize表示当前数组的有效大小,也是0
    level当前层级也是0
  2. 访问根节点
    当前level是0,level不小于sumsSize,表示当前层未初始化
    初始化新层,sum[0] = 5.0, cuonts[0] = 1
    更新有效层数,countsSize = 1, sumsSize = 1
  3. 访问节点6
    当前level是1,level不小于sumsSize,表示当前层未初始化
    初始化新层,sum[1] = 6.0, cuonts[1] = 1
    更新有效层数,countsSize = 2, sumsSize = 2
  4. 访问节点3
    当前level是1,level小于sumsSize,表示当前层已初始化
    更新当前层,sum[1] = 9.0, cuonts[1] = 2
  5. 访问节点2
    当前level是2,level不小于sumsSize,表示当前层未初始化
    初始化新层,sum[2] = 2.0, cuonts[2] = 1
    更新有效层数,countsSize = 3, sumsSize = 3
  6. 访问节点8
    当前level是2,level小于sumsSize,表示当前层已初始化
    更新当前层,sum[2] = 10.0, cuonts[2] = 2
  7. 访问节点7
    当前level是2,level小于sumsSize,表示当前层已初始化
    更新当前层,sum[2] = 17.0, cuonts[2] = 3
int countsSize;
int sumsSize;

void dfs(struct BTNode* root, int level, int* counts, double* nums)
{
	if (root == NULL)
		return 0;
	// 如果超过当前最大层数,初始化新层
	if (level < sumsSize)
	{
		sums[level] += root->val;
		counts[level] += 1;
	}
	else
	{
		sums[sumsSize++] = (double)root->val;
		counts[countsSize++] = 1;
	}
	// 递归访问左右子树
	dfs(root->left, level + 1. counts, sums);
	dfs(root->right, level + 1. counts, sums);
}
double* averageOfLevels(BTNode* root)
{
	countsSize = sumsSize = 0;
	int* counts = malloc(sizeof(int) * 1001);
	double* sums = malloc(sizeof(double) * 1001);
	// 深度优先搜索
	dfs(root, 0, counts, sums);
	// 计算每层的平均值
	double* averages = malloc(sizeof(double) * 1001);
	for (int i = 0; i < sumsSize; i++)
	{
		averages[i] = sums[i] / counts[i];
	}
	return averages;
}

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

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

相关文章

交互开发---测量工具(适用VTK或OpenGL开发的应用程序)

简介&#xff1a; 采用VTK开发应用程序时&#xff0c;经常需要开发各种各样的测量工具&#xff0c;如果沿用VTK的widgets的思路&#xff0c;绘制出来的的控件不够漂亮&#xff0c;且交互不太灵活&#xff0c;并且随着测量工具的增强&#xff0c;渲染的效率也会有所降低。基于上…

【LEAP模型建模】能源需求/供应预测、能源平衡表核算、空气污染物排放预测、碳排放预测、成本效益分析、交通运输碳排放、电力系统优化等专题应用

采用部门分析法建立的LEAP&#xff08;Long Range Energy Alternatives Planning System/ Low emission analysis platform&#xff0c;长期能源可替代规划模型&#xff09;是一种自下而上的能源-环境核算工具&#xff0c;由斯德哥尔摩环境研究所和美国波士顿大学联合研发。该模…

HarmonyOS-中级(三)

文章目录 合理使用动画和转场Web组件和WebView给应用添加通知和提醒 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月08日12点12分 合理使用动画和转场 动效场景设计&#x…

GC常见垃圾回收算法,JVM分代模型

如何判断是垃圾&#xff1f;引用计数器和Root可达性算法 如何进行清除&#xff1f;标记清除、复制、标记整理 堆分代模型&#xff1f;Eden&#xff0c;Surevivor&#xff0c;Tenuring 一个对象从创建到消亡的过程&#xff1f; 对象什么时候进入老年代&#xff1f; 一、GC&a…

win11 恢复任务栏copilot图标, 亲测有效

1、修改C:\Windows\System32\IntegratedServicesRegionPolicySet.json&#xff0c;解除中国不能使用copilot的限制。 使用Notepad搜索copilot全文搜索&#xff0c;将下面两处的“CN,”删除&#xff0c;删除后如下&#xff1a; {"$comment": "Show Copilot on t…

nginx生成自签名证书

nginx生成自签名证书 openssl genrsa -out server.key 2048 openssl req -new -subj "/CCN/STJiangSu/LSuZhou/Oldap/OUldap/CN10.20.24.101" -key server.key -out server.csr openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt …

【sgUploadImage】自定义组件:基于elementUI的el-upload封装的上传图片、相片组件,适用于上传缩略图、文章封面

sgUploadImage源码 <template><div :class"$options.name"><ul class"uploadImages"><liclass"uploadImage"v-loading"loadings[i]"v-for"(a, i) in uploadImages":key"i"click"click…

【重生之我在B站学MySQL】

MySQL笔记 文章目录 MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库 表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp 修改表mysql约束primary key(主键)not null(非空)unique(唯一)foreign key(外键)check自增长 索…

Java版企业电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

eclipse启动的时候,之前一切很正常,但突然报Reason: Failed to determine a suitable driver class的解决

1、之前项目都是启动正常的&#xff0c;然后运行以后发现启动不了了&#xff0c;还会报错&#xff1a; 2、这个Reason: Failed to determine a suitable driver class&#xff0c;说是没有合适的驱动class spring:datasource:url: jdbc:sqlserver://192.168.1.101:1433;databa…

PostGIS分区表学习相关

在Postgresql中对空间数据进行表分区的实践_postgresql空间数据-CSDN博客文章浏览阅读1.4k次&#xff0c;点赞26次&#xff0c;收藏21次。Postgresql的分区功能允许将一个大表按照特定的规则拆分成多个小的分区表。这样做的好处在于&#xff0c;在查询数据时&#xff0c;可以只…

【sgUploadList】自定义组件:基于elementUI的el-upload封装的上传列表组件,适用于上传附件时

sgUploadList源码 <template><div :class"$options.name"><ul class"files"><li v-for"(a, i) in files" :key"i"><sgFileLink :data"a" remove"remove(a, i)" clearable /></…

C#核心(16)万物之父和装箱拆箱

前言 西方说人类的万物之父是亚当&#xff0c;中国说人类的万物之母是女娲&#xff0c;那么c#中有没有一个万物之父呢&#xff1f; 有&#xff0c;我们今天就来浅浅聊一下。 在C#和许多其他面向对象编程语言中&#xff0c;“万物之父”指的是Object类。这个类的历史和重要性…

网页核心页面设计(第7章)

一、生态家居网页 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevi…

IoTDB 删除数据后文件大小不减反增

现象 时序数据库 IoTDB 删除大量数据后&#xff0c;为什么 data 空间不减反增&#xff1f; 原因 IoTDB 的存储引擎采用 LSM&#xff08;Log-Structured Merge&#xff09;架构。在执行删除操作时&#xff0c;系统会生成 .mod 文件来标记删除的数据。这些删除标记会在后续的合…

WPF Prism 01-BootstrapperShell

Prism介绍 Prism 是一个用于在 WPF、.NET MAUI、Uno 平台和 Xamarin Forms 中构建松耦合、可维护和可测试的 XAML 应用程序的框架。每个平台都有单独的发布版本&#xff0c;并且这些版本将在独立的开发时间线上进行开发。Prism 提供了一组设计模式的实现&#xff0c;这些模式有…

html中,实现通过拖拽调整图像尺寸

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>html中拖拽修改图像尺寸</title> <styl…

Composer在安装的过程中经常找不到刚更新的包

明明有v2.1.0版本&#xff0c;安装就是找不到这个版本的包。 1. Composer 官方网址&#xff1a;https://getcomposer.org 中文网站&#xff1a;https://www.phpcomposer.com 官方文档&#xff1a;https://docs.phpcomposer.com 2. Packagist Packagist 是 Composer的组件仓库…

项目实例_FashionMNIST_CNN

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

使用数据库同步中间件DBSyncer实现不同数据库的数据同步

点击上方蓝字关注我 有去O(ORACLE数据库)、信创、国产化数据库等项目实践的同学应该都遇到过不同数据库之前进行数据迁移的问题&#xff0c;虽然有各种工具可以实现&#xff0c;但是有些工具的部署、使用比较复杂&#xff0c;也有些工具迁移数据效率很低。本文将介绍一款开源且…