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

相关文章

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r