题目
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路
这个题目,一开始我是没有思路的,一脸懵逼。
最初想着是搜索去解决,但是结果不一定经过根节点,然后我就没有思路了。
那简化一下问题,如果是答案一定经过根节点,那递归求解就很简单了。
不过深究一下递归求解过程中的函数的定义,该函数是可以求出以该节点为根节点的最值,仅仅而已。
问题在于,如何将子问题合并成原问题的解。
最优解有两种情况,
- 左子树 + 根 + 右子树
- 左子树和右子树较大的 + 根
问题又来了,对于 左子树 + 根 + 右子树
得出的最优解,并不属于其父节点的最优解的包含下的。
而只有 左子树和右子树较大的 + 根
是属于其父节点的最优解的包含下的。
那么像这种非父节点的最优解的包含下的情况左子树 + 根 + 右子树
我们可以用一个全局变量来保存。
那么代码就很容易的写出来了
代码
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));
}
}