深度优先遍历
自底向上的递归。
对于二叉树,我们令每个结点作为
L
C
A
LCA
LCA (最近公共祖先),
结点
u
u
u 作为
L
C
A
LCA
LCA , 经过它的最大路径
=
=
= 往左子树的最大路径
+
+
+ 往右子树的最大路径
+
+
+ 它自己的路径 。
有
a
n
s
=
m
a
x
(
a
n
s
,
v
u
+
l
+
r
ans = max(ans,v_u+l+r
ans=max(ans,vu+l+r)
对于结点
u
u
u 的上层结点,经过
u
u
u 的最大路径
=
m
a
x
(
=max(
=max( 往左走
,
,
, 往右走
)
+
)+
)+ 它自己的路径
有
p
a
t
h
u
=
m
a
x
(
l
,
r
)
+
v
u
path_u=max(l,r)+v_u
pathu=max(l,r)+vu
递归时,自底向上,记录结点的左右最大路径 l / r l/r l/r ,维护结点作为 L C A LCA LCA 的 a n s ans ans 。遇到空结点,没有路径,即为 0 0 0 。
class Solution {
public:
int ans;
int maxPathSum(TreeNode* root) {
ans = INT_MIN;
dfs(root);
return ans;
}
int dfs(TreeNode *root){
if(!root) return 0;
int l = max(0,dfs(root->left)),r = max(0,dfs(root->right));
ans = max(ans,l+r+root->val);
return root->val + max(l,r);
}
};
- 时间复杂度 : O ( n ) O(n) O(n) , 每个结点最多遍历一次,时间复杂度 O ( n ) O(n) O(n) 。
- 空间复杂度 : O ( ∣ h ∣ ) O(|h|) O(∣h∣) , 函数压栈的最大深度 O ( n ) O(n) O(n) 。