悄悄话花费的时间(C语言)【二叉树各结点统计求和】

题目描述

给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。
初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。

输入描述

给定二叉树

0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2

在这里插入图片描述

注:-1 表示空节点

输出描述

返回所有节点都接收到悄悄话花费的时间 38

示例一

输入
0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
输出
38

思路

解题思路:

  1. 构建二叉树:首先,根据题目给出的输入数组(层序遍历顺序),通过递归函数 build 构建一棵完全二叉树。在函数中,当遇到非空节点时(数组值不为-1),创建一个新节点并将其值设置为数组中的当前元素,然后递归地构建其左、右子节点。

  2. 计算传递时间总和:定义一个递归函数 timeSum 来计算以给定节点为根的二叉树中所有节点接收悄悄话所需的时间总和。

    • 当遍历到空节点时,返回0,表示没有额外的传递时间;
    • 对于非空节点,首先递归计算左子树和右子树的最大传递时间;
    • 将当前节点的值与左右子树中的较大传递时间相加,得到从当前节点开始向下传递悄悄话所需的时间;
    • 最终,根节点下的时间总和即为整个二叉树所有节点接收到悄悄话的总时间。
  3. 读取输入:在 main 函数中,读取输入数据,将每个节点值存入数组 nums 中。

  4. 处理输入并计算结果:利用 build 函数根据输入数组构建二叉树,然后调用 timeSum 函数计算所有节点接收悄悄话所需的时间总和,并输出结果。

代码

无注释版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TreeNode {int value;struct TreeNode *left;struct TreeNode *right;
} TreeNode;TreeNode *build(int nums[], int index, int size) {if (index < size && nums[index] != -1) {TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));root->value = nums[index];root->left = build(nums, 2 * index + 1, size);root->right = build(nums, 2 * index + 2, size);return root;}return NULL;
}int timeSum(TreeNode *root) {if (root == NULL) {return 0;}int leftSum = timeSum(root->left);int rightSum = timeSum(root->right);return root->value + (leftSum > rightSum ? leftSum : rightSum);
}
int main() {int nums[100];int size = 0;while (scanf("%d", &nums[size]) != EOF) {size++;}TreeNode *root = build(nums, 0, size);int res = timeSum(root);printf("%d\n", res);return 0;
}

有注释版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义二叉树节点结构体,包含值、左子节点和右子节点
typedef struct TreeNode {int value; // 节点值表示从父节点到该节点传递悄悄话需要的时间struct TreeNode *left;  // 左子节点指针struct TreeNode *right; // 右子节点指针
} TreeNode;// 函数:build
// 功能:根据输入数组构建一棵完全二叉树
// 参数:
//   nums[] - 输入整数数组,按照二叉树层序遍历顺序存储节点值
//   index - 当前处理的数组下标
//   size - 数组大小
// 返回值:
//   构建好的二叉树根节点指针
TreeNode *build(int nums[], int index, int size) {// 如果当前下标有效且不为-1(非空节点)if (index < size && nums[index] != -1) {TreeNode *root =(TreeNode *)malloc(sizeof(TreeNode)); // 为新节点分配内存root->value = nums[index];                // 设置节点值root->left = build(nums, 2 * index + 1, size);  // 创建左子节点root->right = build(nums, 2 * index + 2, size); // 创建右子节点return root;}return NULL; // 如果遇到空节点,则返回NULL
}// 函数:timeSum
// 功能:计算以给定节点为根的二叉树中所有节点接收悄悄话所需的时间总和
// 参数:
//   root - 二叉树根节点指针
// 返回值:
//   所有节点接收到悄悄话花费的总时间
int timeSum(TreeNode *root) {if (root == NULL) { // 如果为空节点,则返回0(没有传递时间)return 0;}// 计算左右子树中的最大传递时间int leftSum = timeSum(root->left);int rightSum = timeSum(root->right);// 返回当前节点的值加上左右子树中较大传递时间return root->value + (leftSum > rightSum ? leftSum : rightSum);
}int main() {int nums[100];int size = 0;// 读取输入直到文件结束,并将节点值存入数组while (scanf("%d", &nums[size]) != EOF) {size++;}// 根据输入数组构建二叉树TreeNode *root = build(nums, 0, size);// 计算所有节点接收到悄悄话的总时间int res = timeSum(root);printf("%d\n", res);return 0;
}

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

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

相关文章

前端数据可视化:ECharts使用

可视化介绍 ​  ​  应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使用&#xff0c;可视化图表来展示体现数据&#xff0c;让数据更加直观&#xff0c;数据特点更加突出。   ​  数据可视化主要目…

远程linux机器中使用camera

linux远程桌面访问时&#xff0c; 发现打不开camera&#xff0c; 需要进行下面的操作才能打开 首先查看video设备的权限 ls -la /dev/video0 crw-rw---- 1 root video 81, 0 Jul 22 19:54 /dev/video0这种情况下远程打不开&#xff0c;需添加权限 添加访问的权限&#xff1a…

openssl 生成nginx自签名的证书

1、命令介绍 openssl req命令主要的功能有&#xff0c;生成证书请求文件&#xff0c; 查看验证证书请求文件&#xff0c;还有就是生成自签名证书。 主要参数 主要命令选项&#xff1a; -new :说明生成证书请求文件 -x509 :说明生成自签名证书 -key :指定已…

【大数据】Flink 内存管理(一):设置 Flink 进程内存

Flink 内存管理&#xff08;一&#xff09;&#xff1a;设置 Flink 进程内存 1.配置 Total Memory2.JVM 参数3.根据比例限制的组件&#xff08;Capped Fractionated Components&#xff09; Apache Flink 通过严格控制各种组件的内存使用&#xff0c;在 JVM 上提供高效的工作负…

全面解析企业财务报表系列之四:财务报表的真实性和可靠性

全面解析企业财务报表系列之四&#xff1a;财务报表的真实性和可靠性 一、什么是会计方法二、选择会计方法三、会计方法的重要性四、会计报表常用的造假手段五、财务报表经常被遗漏的重要事件六、财务报告造假的资信敏感性七、财务报告审计的重要性八、审计报告 一、什么是会计…

微信小程序商城-兜点零食

微信小程序商城 【微信小程序商城-兜点零食】 小程序采用uniappvue开发&#xff0c;后台djangopython开发&#xff0c;模块化方便二次开发 1、具备商城完整功能&#xff0c;包括在线下单、支付、订单跟踪、物流查询&#xff1b; 2、具备社交化分享功能&#xff0c;为用户提供分…

2024年数学建模美赛详细总结以及经验分享

前言&#xff1a; 本文记录与二零二四年二月六日&#xff0c;正好今天是数学建模结束&#xff0c;打算写篇文章记录一下整个过程&#xff0c;以及一些感受、还有经验分享。记录这个过程的原因就是我在赛前&#xff0c;在博客上找了很久&#xff0c;也没有像我这么类似记…

LeetCode刷题小记 三、【哈希表】

1. 哈希表 文章目录 1. 哈希表写在前面1.1 理论基础1.2 有效的字母异位词1.3 两个数组的交集1.4 快乐数1.5 两数之和1.6 四数相加||1.7 赎金信1.8 三数之和&#xff08;哈希法梦碎的地方&#xff09;1.9 四数之和 Reference 写在前面 本系列笔记主要作为笔者刷题的题解&#x…

WebServer -- 定时器处理非活动连接(下)

目录 &#x1f382;前言 &#x1f33c;定时器设计 &#x1f600;容器设计 &#x1f33c;任务处理函数 &#x1f6a9;源码分析&#xff08;定时器的使用&#xff09; &#x1f382;前言 PS&#xff1a;写博客 -- 巩固项目基础过程中&#xff0c;可以通过 GPT Google cpp…

基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型质量非常高&#xff0c;运行效果完美。本模型为4机并联孤岛系统&#xff0c;在下垂控制的基础上加入二次控制&#xff0c;二次电压与频率协同控制策略利用事件触发的方法来减少控制器的更新次数。该方法…

easyui 手风琴Accordion 面板的高度设置

今天接到一个新的小需求&#xff0c;如下图&#xff0c;当预算表单只有一个时&#xff0c;要求不显示预算表单这块的内容。 考虑到页面创建时用到了表单的回调和点击方法&#xff0c;所以不能单纯的移除&#xff0c;移除右侧表格的创建会报错&#xff0c;所以只能隐藏。 隐藏…

Docusaurus框架——快速搭建markdown文档站点介绍sora

文章目录 ⭐前言⭐初始化项目&#x1f496; 创建项目&#xff08;react-js&#xff09;&#x1f496; 运行项目&#x1f496; 目录文件&#x1f496; 创建一个jsx页面&#x1f496; 创建一个md文档&#x1f496; 创建一个介绍sora的文档 ⭐总结⭐结束 ⭐前言 大家好&#xff0…

劫持已经存在的DLL

这里找到一个成功加载的 这里先把原来程序正常的dll改名为libEGL1.dll&#xff0c;然后将我们自己的dll改名为libEGL.dll 然后再重新执行程序&#xff0c;这里同样是弹出了窗口

QEMU源码全解析 —— virtio(20)

接前一篇文章&#xff1a; 上回书重点解析了virtio_pci_modern_probe函数。再来回顾一下其中相关的数据结构&#xff1a; struct virtio_pci_device struct virtio_pci_device的定义在Linux内核源码/drivers/virtio/virtio_pci_common.h中&#xff0c;如下&#xff1a; /* O…

centos7 docker 安装

1.卸载之前docker环境 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docke…

Sora-OpenAI 的 Text-to-Video 模型:制作逼真的 60s 视频片段

OpenAI 推出的人工智能功能曾经只存在于科幻小说中。 2022年&#xff0c;Openai 发布了 ChatGPT&#xff0c;展示了先进的语言模型如何实现自然对话。 随后&#xff0c;DALL-E 问世&#xff0c;它利用文字提示生成令人惊叹的合成图像。 现在&#xff0c;他们又推出了 Text-t…

编程笔记 Golang基础 023 切片

编程笔记 Golang基础 023 切片 一、切片二、定义与初始化三、基本操作四、示例 Go语言中的切片&#xff08;slices&#xff09;是基于数组的抽象数据类型&#xff0c;它提供了一种灵活的方式来处理可变长度的数据序列。切片本身不存储任何数据&#xff0c;而是指向底层数组的一…

bat脚本进程停止与启动

在Windows操作系统中&#xff0c;批处理&#xff08;Batch&#xff09;脚本是一种常见的自动化脚本工具&#xff0c;通过BAT文件来执行一系列DOS命令。通过BAT脚本&#xff0c;我们可以轻松地控制进程的启动和停止。 一、进程停止 在BAT脚本中&#xff0c;要停止一个进程&…

如何设计一个数模混合芯片?

一、如何设计一个数模混合芯片&#xff1f; 根据需求功能设计数模混合芯片的架构是一个多步骤的过程。以下是一些关键步骤和考虑因素&#xff1a; 需求分析&#xff1a;首先&#xff0c;需要明确数模混合芯片的功能需求。这包括确定模拟电路和数字电路的具体需求&#xff0c;以…

推荐几个不错的技术管理的视频讲座

推荐几个不错的技术管理的视频讲座&#xff0c;均来自DEEPLUS公众号组织的线上视频讲座&#xff0c;地址如下&#xff1a; 1&#xff09; 技术管理者如何搭班子、带队伍&#xff1f;技术管理者如何搭班子、带队伍&#xff1f;_哔哩哔哩_bilibili 2&#xff09; 从技术转管理后&…