当前位置:   article > 正文

題解/算法 {2385. 感染二叉树需要的总时间}_请问一下leetcode 2385

请问一下leetcode 2385

题目链接

题解

我们可能很容易的认为:

R为树根, T为感染点, 假设T在R的右侧
令L1 为 R左子树的最大高度, L2为 R与T的距离, L3为 T往下的深度;
那么, L1 + L2就是 T往上的最大距离, 答案是max(L1 + L2, L3)

其实这是错误的…

T往下的距离, 最大确实是L3

但是, T往上 的最大深度, 不一定是: L1 + L2; (L1 + L2的意思是: 从T往上, 且 经过R点 的最大深度)
… T往上, 可以不经过R点; (即, T往上 还没到R点, 在某个中间点, 就往左拐了)

比如:

  R
    A
  B   T
 C
  • 1
  • 2
  • 3
  • 4

此时, L1为0; L2为2; L3为0; 按照上面算法是max(0+2, 0) = 2

但是, 最长距离是T -> A -> B -> C 为(3)


这个题说白了很简单, 就是:
从以R为树根的角度, 求一个点: (往下) 和 (往上) 的最深距离;
朴素算法就是 两次DFS, 一次DFS求往下的距离, 一次DFS求往上的距离

产生这种max( L1 + L2, L3)的想法, 源自于: 你想仅通过一次DFS, 就 既求出往下距离, 又求出往上距离…
其实是做不到的…

代码

int dfs_lr( TreeNode* _cur){
    if( _cur == nullptr){ return 0;}
    //--
    int cur = _cur->val;
    lef_d[ cur] = dfs_lr( _cur->left);
    right_d[ cur] = dfs_lr( _cur->right);
    return max( lef_d[ cur], right_d[ cur]) + 1;
}
void dfs_up( TreeNode* _cur, int _up_d){
    if( _cur == nullptr){ return;}
    //--
    int cur = _cur->val;
    up_d[ cur] = _up_d;
    dfs_up( _cur->left, max( _up_d, right_d[ cur]) + 1);
    dfs_up( _cur->right, max( _up_d, lef_d[ cur]) + 1);
    return;
}
int amountOfTime( TreeNode* root, int start) {
    dfs_lr( root);
    dfs_up( root, 0);
    return max( max( lef_d[ start], right_d[ start]), up_d[ start]);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/510106
推荐阅读
相关标签
  

闽ICP备14008679号