题目

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

思路

这个题目,一开始我是没有思路的,一脸懵逼。
最初想着是搜索去解决,但是结果不一定经过根节点,然后我就没有思路了。
那简化一下问题,如果是答案一定经过根节点,那递归求解就很简单了。
不过深究一下递归求解过程中的函数的定义,该函数是可以求出以该节点为根节点的最值,仅仅而已。
问题在于,如何将子问题合并成原问题的解。
最优解有两种情况,

  1. 左子树 + 根 + 右子树
  2. 左子树和右子树较大的 + 根

问题又来了,对于 左子树 + 根 + 右子树 得出的最优解,并不属于其父节点的最优解的包含下的。
而只有 左子树和右子树较大的 + 根 是属于其父节点的最优解的包含下的。

那么像这种非父节点的最优解的包含下的情况左子树 + 根 + 右子树 我们可以用一个全局变量来保存。
那么代码就很容易的写出来了

代码

class Solution {
   
private:
    int ret = INT_MIN;
    int getMax(TreeNode * root) {
   
        if (root == nullptr) return 0;
        int left = max(0, getMax(root->left));
        int right = max(0, getMax(root->right));
        ret = max(ret, root->val + left + right);
        return max(left, right) + root->val; 
    }
public:
    int maxPathSum(TreeNode* root) {
   
        return max(ret, getMax(root));
    }
}