思路分析:
我们将取出最大路径和的路径二叉树中,最顶端的节点称为顶节点,则除了顶节点同时提供了左右两个子节点以外,其他任何一个父节点在最大路径中只能提供左右节点中的其中一个。
进行分类讨论:
-
除了顶节点外的其他父节点:
只能提供左右其中一边的值,因此需要进行左右节点可提供的最大贡献值的比较; 即比较此父节点连接其左叉树的收益和连接其右叉树的收益; (注意:当某个子节点贡献值为负数时,我们将选择不连接此节点) (因此需加上子节点贡献值与0的比较)
-
顶节点:
顶节点的选择需要判断: 次一级顶节点 加上 此顶节点以及此顶节点的另一子叉树 后,最大路径和是否增加; 这是判断是否进行顶节点的变换的依据;
代码实现(c++):
class Solution
{
public:
int sum=INT_MIN;
int maxnode(TreeNode* root)
{
if(root==nullptr) return 0;
int lm=max(maxnode(root->left),0);
int rm=max(maxnode(root->right),0);
sum=max(lm+rm+root->val,sum);
return max(lm,rm)+root->val;
}
int maxPathSum(TreeNode* root)
{
maxnode(root);
return sum;
}
};
运行结果: