给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3] 1 / \ 2 3 输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7 输出: 42
分析:给定一个非空节点,最终路径经过这个节点有4种情况:1.只有该节点本身(左右子树的路径都是负数);2.该节点+左子树路径;3.该节点+右子树路径;4.该节点+左子树路径+右子树路径。其中1,2,3都可以作为子树路径和向上延伸,而4则不行。
代码如下:
/**
* 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 {
public:
int result;
int maxPathSum(TreeNode* root) {
result = INT_MIN; // 考虑全部节点为负数的情况
getPath(root);
return result;
}
int getPath(TreeNode* node) {
if(node == NULL) {
return 0;
}
int left = getPath(node->left);
int right = getPath(node->right);
int tmp = max(max(left+node->val, right+node->val), node->val); // 这三种情况是经过节点node且可以向上组合的,需要返回给上层使用
result = max(result,max(tmp, left+right+node->val)); // 不能向上组合的情况只需要用于更新结果,无需向上返回
return tmp;
}
};