題解/算法 {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

此时, 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值