给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum
执行用时:40 ms, 在所有 C++ 提交中击败了84.13%的用户
内存消耗:28.2 MB, 在所有 C++ 提交中击败了7.69%的用户
class Solution {
private:
int max_value = INT_MIN;
int dfs(TreeNode *root)
{
if(root)
{
int a = 0,b = 0,c = 0;
a = dfs(root->left);
b = dfs(root->right);
c = root->val + std::max(a>0?a:0,b>0?b:0);
max_value = std::max(max_value,root->val+(a>0?a:0)+(b>0?b:0));
return c;
}
else return 0;
}
public:
int maxPathSum(TreeNode* root) {
dfs(root);
return max_value;
}
};
1、果然还是要睡醒了才能解题。
2、这道题的难度为hard,对自己来说还是要花一些时间才能有思路
3、这道题的难点在于树中任意两个节点连接的路径,获得路径中所有节点的和的最大值。
4、解题思路:
使用后根序遍历,判断左右子树的节点的返回值情况。
这里有一个重点是某一个节点的返回值和它的max_value的判断值不一样。
ret当前节点返回值,left表示左节点返回值,right表示右节点返回值,curval表示当前节点的值。
当前节点的返回值为:
ret = curval+max(left>0?left:0,right>0?right:0)
以当前节点为祖父节点所得到的最大值。
max_value = max(max_value,curval+(left>0?left:0)+(right>0?right:0))
第一次:节点-8 -8左右节点为空,分别返回0,max_value = max(max_value,-8+0+0);返回值为-8+max(0,0),//max_value = -8;
第二次:节点1 1左右节点为空 ,分别返回0,max_value = max(max_value,1+0+0);返回值为1+max(0,0),//max_value = 1;
第三次:节点9 左节点返回值-8,因为小于0,所以判断为0,右节点返回值为1 max_value = max(max_value,9+0+1);返回值为9+max(1,0),//max_value = 10;
右边一样。。。。。。。。。。。。。一次类推得到结果
5、自己懂,感觉要记录下来有点难,不知道该怎么写才好。