1 题目
124. 二叉树中的最大路径和
剑指 Offer II 051. 节点之和最大的路径
2 解答
/**
* 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 {
public:
int maxPathSum(TreeNode* root) {
int maxSum = INT_MIN;
dfs(root, maxSum);
return maxSum;
}
/*
返回以root为根节点的树对外所能提供的最大路径和
root节点“对外”提供的最大路径和为:root->val + max(max(0, dfs(root->left,maxPathSum)) + max(0, dfs(root->right,maxPathSum)))
这里说的“对外”提供的意思是root作为“子树”能提供的最大路径和,如果子树提供的最大路径和为负,那么root的上层父节点肯定不会需要这种“负”的帮助,所以需要用0截断;
如果要计算以root为根,这棵树本身的最大路径和,则是: root->val + max(0, dfs(root->left,maxPathSum)) + max(0, dfs(root->right,maxPathSum));
maxPathSum的目的就是保存在递归的过程中最大路径和。
*/
int dfs(TreeNode* root, int& maxPathSum)
{
//如果是NULL节点,则该节点对外所能提供的最大路径和为0
if (!root)
{
return 0;
}
//如果作为子树提供的最大路径和为负,则对其父节点的路径和没有什么作用,需要用0截断
int left = std::max(0, dfs(root->left, maxPathSum)), right = std::max(0, dfs(root->right, maxPathSum));
//以root为根的树本身的最大路径和为:root->val + left + right
//求解全局的最大路径和
maxPathSum = std::max(maxPathSum, root->val + left + right);
//以root为根的“子树”对外提供(也就是对上层节点)的最大路径和
return root->val + std::max(left, right);
}
};