题目链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
解题步骤:
-
求二叉树的最大路径和,即求以每个节点为根节点的二叉树的最大路径和,再取其中的最大值
-
最大路径和可以通过:root->val + 左子节点最大贡献 + 右子节点最大贡献
-
通过一个变量maxSum随时更新最大路径和
-
接下来,完成每个节点最大贡献的求解就可以求解本题
-
我们以示例2为例:
-10 / \ 9 20 / \ 15 7
叶子节点的贡献值为节点的值,即节点9,15,7的贡献值为9,15,7
因为每个节点的最大贡献值,只能选取左右子节点其中一个,和根节点进行相加,则节点20的最大贡献值等于 20+max(15,7)=35,节点−10的最大贡献值等于−10+max(9,35)=25
定义一个函数dfs(root)计算root节点的最大贡献,使用深度优先搜索,即可以得到每个节点的最大贡献
C++实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
int sumMax = INT_MIN;
public:
int dfs(TreeNode* root) {
if (root == nullptr)
return 0;
int left = max(dfs(root->left), 0); // 如果最大贡献小于0,此路径不需考虑,赋值为0
int right = max(dfs(root->right), 0);
sumMax = max(sumMax, root->val + left + right); // 更新最大路径和
return root->val + max(left, right); // 返回节点的最大贡献
}
int maxPathSum(TreeNode* root) {
dfs(root);
return sumMax;
}
};