124. 二叉树中的最大路径和
【题目】:124. 二叉树中的最大路径和
这题有两个关键点:
- 更新res:
res = max(l + r + root->val, res)
,左子树最大链长 + 右子树最大链长 + 根节点的值其实也可以当成一条链 - 子树root的最大链长:
max(max(l, r) + root->val, 0)
,由于一个子树的链长只能取左子树的最大链长或右子树的最大链长,所以这里先max(l, r)
,也别忘了+root->val
,由于这个值可能比0还小,如果比0小那要你还有什么用?直接舍弃好了(0表示什么都不取)
class Solution {
public:
int res = INT_MIN;
int help(TreeNode* root) {
if(root == nullptr) {
return 0;
}
int l = help(root->left); // 左子树的最大链和
int r = help(root->right); // 右子树的最大链和
res = max(l + r + root->val, res); // l + r + root->val:左右子树的联合可以拼成一条链
return max(max(l, r) + root->val, 0); // 当前子树的联和:max(l, r) + root->val,因为是链,所以左右子树只能取一条
}
int maxPathSum(TreeNode* root) {
help(root);
return res;
}
};
- 时间复杂度: O(n)
- 空间复杂度: O(n)