牛客对应题目链接:二叉树中的最大路径和_牛客题霸_牛客网
力扣对应题目链接:124. 二叉树中的最大路径和 - 力扣(LeetCode)
一、分析题目
树形 dp :
- 左子树收集:以左子树为起点的最大单链和。
- 右子树收集:以右子树为起点的最大单链和。
- 根节点要做的事情:整合左右子树的信息,得到经过根节点的最大路径和。
- 向上返回:以根节点为起点的最⼤单链和。
二、代码
//值得学习的代码
class Solution
{
public:
int ret = -1010;
int maxPathSum(TreeNode* root)
{
dfs(root);
return ret;
}
int dfs(TreeNode* root)
{
if(root == nullptr) return 0;
int l = max(0, dfs(root->left));// 左⼦树的最⼤单链和
int r = max(0, dfs(root->right)); // 右⼦树的最⼤单链和
// 经过root的最⼤路径和
ret = max(ret, root->val + l + r);
return root->val + max(l, r);
}
};
//力扣AC代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
int maxSum=INT_MIN;
public:
int maxGain(TreeNode* node)
{
if(node==nullptr) return 0;
int leftGain=max(0, maxGain(node->left));
int rightGain=max(0, maxGain(node->right));
int sum=leftGain+rightGain+node->val;
maxSum=max(maxSum, sum);
return node->val+max(leftGain, rightGain);
}
int maxPathSum(TreeNode* root) {
maxGain(root);
return maxSum;
}
};