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

双分支节点个数

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

算法思想

计算一棵二叉树中所有双分支节点个数的递归模型
若树为空,结果为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;
}

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

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

相关文章

MySQL:表的内置函数

目录 一. 日期函数 二. 字符串函数 三. 数学函数​编辑 四. 其他函数 此篇博客讲解MySQL中关于表的内置函数。内置函数广泛用于数据库查询语句中。 一. 日期函数 例子一&#xff1a;创建一个样例表&#xff1a; 类似于隐式转换&#xff0c;虽然这样可以但是不建议。 …

Vue框架入门

Author&#xff1a;Dawn_T17?? 目录 什么是框架 一.Vue 的使用方向 二.Vue 框架的使用场景 &#xff08;TIP&#xff09;MVVM思想 三.Vue入门案例 TIP&#xff1a;插值表达式 四.Vue-指令? &#xff08;1&#xff09;v-bind 和 v-model? ? &#xff08;2&#x…

【OpenCV】图像转换

理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;使用 2D离散傅里叶变换&#xff08;DFT&#xff09; 查找频域。快速算法称为 快速傅立叶变换&#xff08;FFT&#xff09; 用于计算DFT。 Numpy中的傅立叶变换 首先&#xff0c;我们将看到如何使用Numpy查…

Nanolog起步笔记-10-log解压过程(4)寻找meta续2

Nanolog起步笔记-10-log解压过程4寻找meta续2 写在前面重新开始trace 写在前面 前面的工作&#xff0c;已做打下令人有信心的基础。 重新开始trace 之前我们起步就看到了 metadata &#xff0c;显然这前就已加载了。 所以&#xff0c;只需要重走一遍代码&#xff0c;就能得到…

Vue3+Node中使用webrtc推流至mediamtx

前言 项目的 Web 端是 Vue3 框架&#xff0c;后端是 GO 框架。需要实现将客户端的本地摄像头媒体流推送至服务端&#xff0c;而我自己从未有媒体流相关经验&#xff0c;最初 leader 让我尝试通过 RTSP 协议推拉流&#xff0c;我的思路就局限在了 RTSP 方向。 最初使用的服务端…

小程序IOS安全区域优化:safe-area-inset-bottom

ios下边有一个小黑线&#xff0c;位于底部的元素会被黑线阻挡 safe-area-inset-bottom 一 用法及作用&#xff1a; IOS全面屏底部有小黑线&#xff0c;位于底部的元素会被黑线阻挡&#xff0c;可以使用以下样式&#xff1a; .model{padding-bottom: constant(safe-area-ins…

NVR小程序接入平台EasyNVR国标协议接入无告警是什么原因?

在现代视频监控系统中&#xff0c;国标接入已成为一种重要的技术标准&#xff0c;尤其是在GB28181协议的推动下&#xff0c;这一标准被广泛应用于安防设备的统一接入和管理。国标接入不仅提高了设备间的互联互通能力&#xff0c;还为用户提供了更高效、更智能的视频监控解决方案…

在CSDN设置“关注博主即可阅读全文”

我们在平时CSDN上搜索文章&#xff0c;打开文章&#xff0c;需要关注博主方可继续阅读的&#xff0c;相必有人会很困惑&#xff0c;也有人会觉得很烦。一般选择先关注&#xff0c;看完取消关注&#xff0c;不管怎么说&#xff0c;今天我来教大家如何设置“关注博主即可阅读全文…

《AI行政管理:开启高效治理新时代》

一、引言 AI 行政管理能力的定义和重要性 AI 行政管理能力是指人工智能在行政管理领域的应用能力。它涵盖了多个方面&#xff0c;包括政府决策支持、公共服务优化、行政流程自动化、社会治理与公共安全以及政府内部管理等。在当今时代&#xff0c;AI 行政管理能力具有至关重要…

`yarn list --pattern element-ui` 是一个 Yarn 命令,用于列出项目中符合指定模式(`element-ui`)的依赖包信息

文章目录 命令解析&#xff1a;功能说明&#xff1a;示例输出&#xff1a;使用场景&#xff1a; yarn list --pattern element-ui 是一个 Yarn 命令&#xff0c;用于列出项目中符合指定模式&#xff08; element-ui&#xff09;的依赖包信息。 命令解析&#xff1a; yarn list…

Vue前端实现预览并打印PDF文档

一. 需求 1. 点击文档列表中的【打印】按钮&#xff0c;获取后台生成的PDF的url&#xff0c;弹窗进行预览&#xff1a; 2. 点击【打印】按钮&#xff0c;进行打印预览和打印&#xff1a; 二. 需求实现 首先后台给的是word文档&#xff0c;研究了一圈后发现暂时无法实现&…

【开源】A066—基于JavaWeb的农产品直卖平台的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

MR20一体式IO 在3C领域的应用

一、导读 该公司成立于1999年&#xff0c;是中国最早专注于泛半导体产业的投资机构&#xff0c;于2015年在 新三板上市。是集研发&#xff0c;制造&#xff0c;销售&#xff0c;服务于一体的国家级高新技术企业&#xff0c;致力于提供暖通空调及供热采暖 控制为核心的产品、技…

Conda + JuiceFS :增强 AI 开发环境共享能力

Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统&#xff0c;因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎。 Conda 支持在不同的操作系统上重建相同的工作环境&#xff0c;但在环境共享复用方面仍存在一些挑战。比如&#xff0c;在不同机器上复用相…

【推荐算法】单目标精排模型——FiBiNET

key word: 学术论文 Motivation&#xff1a; 传统的Embedding&MLP算法是通过内积和Hadamard product实现特征交互的&#xff0c;这篇文章的作者提出了采用SENET实现动态学习特征的重要性&#xff1b;作者认为简单的内积和Hadamard product无法有效对稀疏特征进行特征交互&a…

启动你的RocketMQ之旅(二)-broket和namesrv启动流程

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a; 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;java专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;请指正&#…

vue3-canvas实现在图片上框选标记(放大,缩小,移动,删除)

双图版本&#xff08;模板对比&#xff09; 业务描述&#xff1a;模板与图片对比&#xff0c;只操作模板框选的位置进行色差对比&#xff0c;传框选坐标位置给后端&#xff0c;返回对比结果显示 draw.js文件&#xff1a; 新增了 createUuid&#xff0c;和求取两个数组差集的方…

python编程Day13-异常介绍捕获异常抛出异常

异常 介绍 1, 程序在运行时, 如果Python解释器遇到到一个错误, 则会停 止程序的执行, 并且提示一些错误信息, 这就是异常. 2, 程序停止执行并且提示错误信息这个动作, 通常称之为: 抛出 (raise) 异常 # f open(aaaa.txt) # FileNotFoundError: [Errno 2] No such file or dire…

计网(王道的总结)-数据链路层-网络层-传输层

由于时间有限&#xff0c;把每个王道的章节最后一节放在一起&#xff0c;分别看看复习知识点。 3.6.4 IEEE 802.11 无线局域网 重点&#xff1a; 3.7 广域网 真题考频&#xff1a;极低 3.8以太网交换机 4.1网络层的功能 4.2.1IPv4分组 最重要的&#xff1a; TTL&#xff1a;…

【优选算法篇】:揭开二分查找算法的神秘面纱--数据海洋中的精准定位器

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 一.二分查找算法二.算法模板模板一模板二模板三 三.例题演练1.x的平…