题解
我们可能很容易的认为:
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]);
}