Leecode刷题C语言之统计好节点的数目
执行结果:通过
执行用时和内存消耗如下:

题目:统计好节点的数目
现有一棵 无向 树,树中包含 n 个节点,按从 0 到 n - 1 标记。树的根节点是节点 0 。给你一个长度为 n - 1 的二维整数数组 edges,其中 edges[i] = [ai, bi] 表示树中节点 ai 与节点 bi 之间存在一条边。
如果一个节点的所有子节点为根的子树包含的节点数相同,则认为该节点是一个 好节点。返回给定树中 好节点 的数量。子树 指的是一个节点以及它所有后代节点构成的一棵树。
解题思路:
- 定义节点结构:
- 使用
struct ListNode来表示树中的节点。每个节点包含一个整数值val和一个指向下一个节点的指针next。
- 使用
- 创建节点:
- 函数
create(int val)用于创建一个新的节点,并初始化其值为val,其next指针为NULL。该函数使用malloc动态分配内存,并检查内存分配是否成功。
- 函数
- 辅助数组和变量:
subtree_size[100010]:用于存储每个节点的子树大小(包括节点自身)。good_node_cnt:用于计数“好节点”的数量。
- 深度优先搜索(DFS):
- 函数
dfs(struct ListNode **adj, int cur, int pa)通过深度优先搜索遍历树。 adj是一个数组,其中adj[i]是一个链表的头节点,链表包含所有连接到节点i的节点。cur是当前访问的节点。pa是父节点的索引,用于避免在遍历子节点时回到父节点,形成环路。- 在遍历过程中,首先设置当前节点的子树大小为1(只包括节点自身)。
- 然后遍历当前节点的所有子节点(通过链表),对每个子节点递归调用
dfs。 - 累加每个子节点的子树大小到当前节点的子树大小。
- 跟踪第一个子节点的子树大小,并检查是否所有子节点的子树大小都相等。如果相等,则将当前节点标记为“好节点”。
- 函数
- 构建树的邻接表:
- 在
countGoodNodes函数中,首先计算节点的总数n(等于边数加1,因为无向树有n-1条边)。 - 初始化邻接表
adj,它是一个数组,其中每个元素是一个链表的头节点,链表包含连接到该节点的所有节点。 - 遍历边数组
edges,对于每条边(x, y),创建两个节点(如果尚未存在),并将它们添加到相应的邻接表中,形成双向连接。
- 在
- 计算好节点的数量:
- 调用
dfs函数,从根节点(节点0)开始遍历树。 - 在遍历完成后,
good_node_cnt变量将包含树中“好节点”的总数。
- 调用
- 返回结果:
- 函数
countGoodNodes返回“好节点”的总数。
- 函数
struct ListNode *create(int val) {struct ListNode *node = NULL;node = malloc(sizeof(*node));if (node == NULL) return NULL;node->val = val;node->next = NULL;return node;
}
int subtree_size[100010];
int good_node_cnt;
void dfs(struct ListNode **adj, int cur, int pa) {subtree_size[cur] = 1;int first_child_size = -1;bool is_good_node = true;for (struct ListNode *p = adj[cur]; p != NULL; p = p->next) {int child = p->val;if (child == pa) {continue;}dfs(adj, p->val, cur);subtree_size[cur] += subtree_size[child];if (first_child_size == -1) {first_child_size = subtree_size[child];} else {if (first_child_size != subtree_size[child]) {is_good_node = false;}}}if (is_good_node) {good_node_cnt++;}return ;
}
int countGoodNodes(int** edges, int edgesSize, int* edgesColSize) {int n = edgesSize + 1;good_node_cnt = 0;struct ListNode *adj[n];for (int i = 0; i < n; i++) {adj[i] = NULL;}for (int i = 0; i < edgesSize; i++) {int x = edges[i][0], y = edges[i][1];struct ListNode *xnode = create(x);xnode->next = adj[y];adj[y] = xnode;struct ListNode *ynode = create(y);ynode->next = adj[x];adj[x] = ynode;}dfs(adj, 0, -1);return good_node_cnt;
}
相关文章:
Leecode刷题C语言之统计好节点的数目
执行结果:通过 执行用时和内存消耗如下: 题目:统计好节点的数目 现有一棵 无向 树,树中包含 n 个节点,按从 0 到 n - 1 标记。树的根节点是节点 0 。给你一个长度为 n - 1 的二维整数数组 edges,其中 edges[i] [ai,…...
webpack5 + vue3 从零配置项目
前言 虽然在实际项目当中很少会从 0 到 1 配置一个项目,毕竟很多重复工作是没有必要的,脚手架将这些重复性的工作进行了整合,方便开发者使用。也正因如此,导致部分开发者过于依赖脚手架,却不清楚其内部的实现流程&…...
Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
案例问题描述 该案例来自一个金融行业客户的问题:他们发现某个应用对一个数据量相对较小的表(仅包含数千条记录)访问时,频繁遇到性能下降的情况。为解决此问题,客户向我们求助进行分析。我们发现这张表有频繁的批量插…...
./mysqld: error while loading shared libraries: libaio.so.1: cannot open sha
mysql:5.6 使用离线方式安装:rpm -ivh --nodeps mysql* ,执行 systemctl start mysqld.service发现启动不了,通过vi /var/log/mysql.log看到如下关键字:libraries: libaio.so.1,之前也是按照网上帖子各种修改都没有解决…...
Qt主线程把数据发给子线程,主线程会阻塞吗
演示: #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…...
前后端、网关、协议方面补充
这里写目录标题 前后端接口文档简介前后端视角对于前端对于后端代码注册路由路由处理函数 关于httpGET/POST底层网络关于前端的获取 路由器网关路由器的IP简介公网IP(WAN IP)私网IP(LAN IP)无线网络IP(WIFI IP)查询路由器私网IP路由器公网IP LAN口与WIFI简介基本原理 手动配置电…...
如何在Mac上切换到JDK 17开发环境
在本文中,我将为您介绍如何在Mac上切换到JDK 17,包括下载和安装JDK 17、设置环境变量、在IntelliJ IDEA中配置项目、修改Maven编译配置,并最终使用mvn clean install重新编译项目。通过这个流程,您可以顺利地将开发环境升级到JDK …...
深入探索 TypeScript:从基础到高级特性
深入探索 TypeScript:从基础到高级特性 一、引言 在现代软件开发领域,TypeScript 已经成为了一种极具影响力的编程语言。它基于 JavaScript,并为其添加了强大的静态类型系统,使得代码在开发阶段就能进行更严格的类型检查&#x…...
Leetcode:118. 杨辉三角——Java数学法求解
题目——Leetcode:118. 杨辉三角 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRow…...
SHELL脚本(Linux)
声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)
目录 1.单元测试 实现单元测试的方法: 注意事项: 2.集成测试 需注意事项: 实现集成测试的方法: 如何实现高效且可靠的集成测试: 3.系统测试 实现系统测试的方法: 须知注意事项: 4.验收测试 实现验…...
低代码集成多方API的简单实现
在现代软件开发中,集成多个API服务提供商已成为常见需求。然而,不同的API认证机制和数据格式使得集成过程变得复杂且耗时。为了应对这些挑战,本文将介绍一种低代码解决方案,通过配置化管理和简化的代码逻辑,帮助开发者…...
【测试框架篇】单元测试框架pytest(1):环境安装和配置
一、pytest简介 Pytest是Python的一种单元测试框架,与Python自带的unittest测试框架类似,但是比 unittest框架使用起来更简洁,效率更高。 二、pytest特点 Pytest是一个非常成熟的Python测试框架,主要特点有以下几点: 非常容易…...
Python数据分析NumPy和pandas(二十九、其他Python可视化工具)
与其他开源工具一样,在 Python 中创建图形有很多选项(太多了,无法一一列举)。自 2010 年以来,主要开发工作集中在创建用于在 Web 上发布交互式图形上。例如: Altair、Bokeh 和 Plotly 等工具,可…...
Unity中HDRP设置抗锯齿
一、以前抗锯齿的设置方式 【Edit】——>【Project Settings】——>【Quality】——>【Anti-aliasing】 二、HDRP项目中抗锯齿的设置方式 在Hierarchy中——>找到Camera对象——>在Inspector面板上——>【Camera组件】——>【Rendering】——>【Pos…...
Spring Boot实现文件上传与OSS集成:从基础到应用
目录 前言1. 文件上传的基础实现1.1 前端文件上传请求1.2 后端文件接收与保存 2. 集成第三方OSS服务2.1 准备工作2.2 编写OSS集成代码2.3 修改Controller实现文件上传至OSS 3. 文件上传的扩展:多文件上传与权限控制结语 前言 随着互联网应用的快速发展,…...
Python学习26天
集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num:{num}\nnum数据类型为:{type(num)}") # 求集合中元素个数 print(f"num中元素个数为:{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…...
linux startup.sh shutdown.sh (kkFileView)
linux启动脚本和关闭脚本startup.sh shutdown.sh (kkFileView) startup.sh DIR_HOME("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.1" "/opt/libreoffice7.0" "/opt/libreoffice7.1&q…...
[MySQL]隐式类型转换
安全等号 <> 如果有参数为NULL,则除了相等比较运算符(),比较的结果为null。对于 nullnull,结果为true。 在select语句中,使用 时,结果不会包含值为 null 的记录,但如果使用安全等号 <> 来…...
面经总结1
文章目录 如何保证批量请求失败,只弹出一个toast1使用计数器:2使用标志变量: 如何减少项目里的if-else1使用多态2使用策略模式3使用字典映射4使用状态模式 babel-runtime 作用是啥如何实现 PDF 预览和下载1浏览器内置PDF阅读器2使用PDF.js库3…...
Qwerty Learner版本发布流程:从开发到上线的标准化
Qwerty Learner版本发布流程:从开发到上线的标准化 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: https://gitcod…...
TP-Link Linux驱动开发面试全记录与实战技巧
1. TP-Link软件工程师面试全记录:Linux驱动开发方向作为一名在嵌入式Linux领域摸爬滚打多年的工程师,最近参加了TP-Link的软件工程师面试,岗位方向是Linux驱动开发。说实话,去之前我对TP-Link的认知还停留在"路由器方案商&qu…...
AI 大模型落地系列|Eino ADK体系篇:你对 ChatModelAgent 有了解吗?
声明:本文源于官方文档,重点参考 Eino ADK: ChatModelAgent、Eino ADK: 概述、Eino ADK: Agent 协作 为什么很多人把 ChatModelAgent 想简单了?一文讲透 ReAct、Transfer、AgentAsTool 与 Middleware1. 为什么很多人会把 ChatModelAgent 想简…...
League-Toolkit:3大核心价值的英雄联盟智能辅助工具
League-Toolkit:3大核心价值的英雄联盟智能辅助工具 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit 是一款基于英雄…...
开源工具Minder:用思维导图释放创意与效率的全功能解决方案
开源工具Minder:用思维导图释放创意与效率的全功能解决方案 【免费下载链接】Minder Mind-mapping application for Elementary OS 项目地址: https://gitcode.com/gh_mirrors/min/Minder 在信息爆炸的时代,您是否经常感到思绪混乱、创意难以捕捉…...
R语言实战:利用compareGroups包高效生成临床研究三线表(Table1)
1. 为什么临床研究离不开Table1三线表 在医学论文和临床研究报告中,Table1三线表几乎是标配。我第一次投稿时,审稿人直接指出"缺少规范的基线特征表",这才意识到这个表格的重要性。Table1的核心作用是展示研究人群的基线特征&#…...
FPGA开发必备:手把手教你安装破解Modelsim 10.5se(附环境变量配置避坑指南)
FPGA开发实战:Modelsim仿真环境搭建与高效调试技巧 对于FPGA开发者而言,一个稳定可靠的仿真环境就像厨师的刀具一样重要。Modelsim作为业界广泛使用的仿真工具,其精确的时序仿真能力可以帮助我们在硬件烧录前发现绝大多数逻辑错误。本文将从一…...
AI辅助开发Playwright脚本:处理文件上传与iframe交互难题
AI辅助开发Playwright脚本:处理文件上传与iframe交互难题 最近在做一个Web自动化测试项目时,遇到了两个特别头疼的问题:文件上传和iframe内的富文本编辑器交互。作为一个刚接触Playwright不久的开发者,这些复杂交互让我卡了好几天…...
从‘带不动’到‘跑满帧’:游戏玩家必懂的显示器带宽与接口选择避坑指南
从‘带不动’到‘跑满帧’:游戏玩家必懂的显示器带宽与接口选择避坑指南 刚入手一台2K 170Hz电竞显示器,却发现刷新率死活上不去?画面时不时出现撕裂或闪烁?别急着怀疑显卡性能,问题可能出在那根被你忽视的连接线上。…...
给RV1126开发板写个‘WiFi管家’:一个脚本搞定连接、断开、状态查看与网络切换
RV1126开发板WiFi管家:打造智能网络管理工具链 在嵌入式开发领域,效率工具的价值往往被严重低估。想象一下这样的场景:当你需要在RV1126开发板上频繁切换测试环境、调试不同AP配置时,每次都要手动输入一长串命令,不仅…...
