LeetCode-127-二叉树中的最大路径

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

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

示例 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;

右边一样。。。。。。。。。。。。。一次类推得到结果

LeetCode-127-二叉树中的最大路径_第1张图片 

 

 5、自己懂,感觉要记录下来有点难,不知道该怎么写才好。

 

 

你可能感兴趣的:(LeetCode)