【题目】: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)