• 树形dp,LeetCode 2385. 感染二叉树需要的总时间


    一、题目

    1、题目描述

    给你一棵二叉树的根节点 root ,二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟,感染 将会从值为 start 的节点开始爆发。

    每分钟,如果节点满足以下全部条件,就会被感染:

    • 节点此前还没有感染。
    • 节点与一个已感染节点相邻。

    返回感染整棵树需要的分钟数

    2、接口描述

    python3
    1. # Definition for a binary tree node.
    2. # class TreeNode:
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution:
    8. def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:
    cpp
    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. int amountOfTime(TreeNode* root, int start) {
    15. }
    16. };

    3、原题链接

    2385. 感染二叉树需要的总时间


    二、解题报告

    1、思路分析

    答案很明显就是求start向上最大距离和向下最大距离中大的那个

    这个还是很好求的,我们可以两次dfs,开两个数组记录下值,就是一个换根dp,换根到start的时候就返回答案即可

    不过更优雅的做法是,我们发现答案来自两部分:start向下最大距离,根节点到start的距离加上从另一颗子树向下的最大距离

    那么实际上我们进行一次dfs即可

    如果找到start或者子树中找到start,我们向上返回深度的时候就返回到达start的距离

    如果没找到,就返回到最远子节点的距离的相反数

    2、复杂度

    时间复杂度: O(n) 空间复杂度:O(n)

    3、代码详解

    python3
    1. # Definition for a binary tree node.
    2. # class TreeNode:
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution:
    8. def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:
    9. ret = 0
    10. def dfs(rt: Optional[TreeNode]) -> int:
    11. if rt is None:
    12. return 0
    13. L = dfs(rt.left)
    14. R = dfs(rt.right)
    15. nonlocal ret
    16. if rt.val == start:
    17. ret = max(ret, -min(L, R))
    18. return 1
    19. if L > 0 or R > 0:
    20. ret = max(ret, abs(L) + abs(R))
    21. return max(L, R) + 1
    22. return min(L, R) - 1
    23. dfs(root)
    24. return ret
    cpp
    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. int ret, start;
    15. int dfs(TreeNode* root){
    16. if(!root) return 0;
    17. int L = dfs(root->left), R = dfs(root->right);
    18. if(root->val == start){
    19. ret = -min(L, R);
    20. return 1;
    21. }
    22. if(L > 0 || R > 0){
    23. ret = max(ret, abs(L) + abs(R));
    24. return max(L, R) + 1;
    25. }
    26. return min(L, R) - 1;
    27. }
    28. int amountOfTime(TreeNode* root, int start) {
    29. ret = 0, this->start = start;
    30. dfs(root);
    31. return ret;
    32. }
    33. };

  • 相关阅读:
    这两个面试题一口气全做对的没几个吧
    带你实现react源码的核心功能
    计算机毕业论文微信小程序毕业设计SSM校园论坛+后台管理系统|前后分离VUE[包运行成功]
    一座 “数智桥梁”,华为助力“天堑变通途”
    3.最长升序子序列 (动态规划)
    【Proteus仿真】【STM32单片机】蔬菜大棚温湿度控制系统设计
    【Flink源码】JobManager源码之启动WebMonitorEndpoint
    HTML页面
    著名音乐app网易云推广运营策划案
    【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究
  • 原文地址:https://blog.csdn.net/EQUINOX1/article/details/138145894