leetcode2389--感染二叉树需要的总时间

2024-04-26 02:52

本文主要是介绍leetcode2389--感染二叉树需要的总时间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 题意

给定一个节点,每秒该节点会感染相邻的节点,受感染的节点下一秒也会感染周围节点;

求使得所有节点感染的时间

2. 题解

2.1 dfs建图+bfs搜索层次

我们将目标节点找到,并从该节点出发找到以该节点形成的树的深度即可。

  • 我的代码
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {public:// * transform tree to graph// * sparse graphvoid build_graph(TreeNode * root, vector<vector<int>> &g) {if (nullptr == root)return;if ( root->left) {g[root->val].push_back( root->left->val);g[root->left->val].push_back(root->val);build_graph(root->left, g);}if ( root->right ) {g[root->val].push_back(root->right->val);g[root->right->val].push_back(root->val);build_graph(root->right, g);}}int amountOfTime(TreeNode* root, int start) {const int MAXN = 1e5 + 1;vector<vector<int>> g(MAXN, vector<int>());build_graph(root, g);int ans = 0;int last = start;queue<int> q;q.push(start);vector<int> vis(MAXN, 0);while (!q.empty()) {int cur = q.front();q.pop();vis[cur] = 1;for (int v:g[cur])if (!vis[v])q.push(v);if (cur == last) {ans++;last = q.back();}}return ans - 1;}
};

2.2 dfs建图+dfs求深度

我们需要找到每个节点的父节点,并且用一个from来表示当前节点是从哪来的以避免重复遍历。

  • 我的代码
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {public:// * transform tree to graph// * sparse graphvoid get_fa(unordered_map<int,TreeNode *> &fa, TreeNode *root, int start, TreeNode *&start_node) {if (root == nullptr)return;if ( root->left)fa[root->left->val] = root;if ( root->right)fa[root->right->val] = root;if ( root->val == start)start_node = root;get_fa(fa, root->left, start, start_node );get_fa(fa, root->right, start, start_node );}int getDepth(TreeNode *root, int from,const unordered_map<int,TreeNode*> &fa) {if ( nullptr == root)return -1;int llen = -1;int rlen = -1;int flen = -1;if ( root->left && root->left->val != from)llen = getDepth(root->left, root->val, fa);if ( root->right && root->right->val != from )rlen = getDepth( root->right, root->val, fa);if (fa.find(root->val) != fa.end() &&fa.at(root->val)->val != from) {// cout << "fa-" << fa.at(root->val)->val << endl;flen = getDepth( fa.at(root->val), root->val, fa);}int ans = max(llen, rlen);ans = max(flen, ans);return ans + 1;}int amountOfTime(TreeNode* root, int start) {unordered_map<int,TreeNode *> fa;TreeNode *start_node;get_fa( fa, root, start, start_node);return  getDepth(start_node, -1, fa);}
};
  • 03xf题解

TreeNode* fa[100001]; // 哈希表会超时,改用数组class Solution {int start;TreeNode* start_node;void dfs(TreeNode* node, TreeNode* from) {if (node == nullptr) {return;}fa[node->val] = from; // 记录每个节点的父节点if (node->val == start) {start_node = node; // 找到 start}dfs(node->left, node);dfs(node->right, node);}int maxDepth(TreeNode* node, TreeNode* from) {if (node == nullptr) {return -1; // 注意这里是 -1,因为 start 的深度为 0}int res = -1;if (node->left != from) {res = max(res, maxDepth(node->left, node));}if (node->right != from) {res = max(res, maxDepth(node->right, node));}if (fa[node->val] != from) {res = max(res, maxDepth(fa[node->val], node));}return res + 1;}public:int amountOfTime(TreeNode* root, int start) {this->start = start;dfs(root, nullptr);return maxDepth(start_node, start_node);}
};作者:灵茶山艾府
链接:https://leetcode.cn/problems/amount-of-time-for-binary-tree-to-be-infected/solutions/2753470/cong-liang-ci-bian-li-dao-yi-ci-bian-li-tmt0x/comments/2287846/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2.3 一次遍历
  • 03xf
class Solution {int ans = 0, start;pair<int, bool> dfs(TreeNode* node) {if (node == nullptr) {return {0, false};}auto [l_len, l_found] = dfs(node->left);auto [r_len, r_found] = dfs(node->right);if (node->val == start) {// 计算子树 start 的最大深度// 注意这里和方法一的区别,max 后面没有 +1,所以算出的也是最大深度ans = max(l_len, r_len);return {1, true}; // 找到了 start}if (l_found || r_found) {// 只有在左子树或右子树包含 start 时,才能更新答案ans = max(ans, l_len + r_len); // 两条链拼成直径// 保证 start 是直径端点return {(l_found ? l_len : r_len) + 1, true};}return {max(l_len, r_len) + 1, false};}public:int amountOfTime(TreeNode* root, int start) {this->start = start;dfs(root);return ans;}
};作者:灵茶山艾府
链接:https://leetcode.cn/problems/amount-of-time-for-binary-tree-to-be-infected/solutions/2753470/cong-liang-ci-bian-li-dao-yi-ci-bian-li-tmt0x/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这篇关于leetcode2389--感染二叉树需要的总时间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936523

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

JavaScript时间戳与时间的转化常用方法

《JavaScript时间戳与时间的转化常用方法》在JavaScript中,时间戳(Timestamp)通常指Unix时间戳,即从1970年1月1日00:00:00UTC到某个时间点经过的毫秒数,下面... 目录1. 获取当前时间戳2. 时间戳 → 时间对象3. 时间戳php → 格式化字符串4. 时间字符

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及