[Leetcode学习-java]Binary Tree Maximum Path Sum(二叉树路径最大和)

问题:

难度:easy

说明:

输入一个二叉树根节点,求出二叉树里面最大的连续路径和,路径不带分叉的,不需要一定返回包含根节点的和。

输入范围:

root不为空。

输入案例:

Example 1:

Input: [1,2,3]

       1
      / \
     2   3

Output: 6
Example 2:

// 20 + 15 + 7最大
Input: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

Output: 42

我的代码:

以前已经做过了一个二叉树问题,Diameter of Binary Tree,求二叉树直径,就是把每个节点和left、right的sum都进行统计,本题的话,因为路径不带分叉,所以计算完root+left+right和root + left / root + right / root,不返回root+left+right是否最大值,然后比较得出最大值返回就可以了。使用递归,也可以用arraylist进行存储,然后拿出来遍历比较,我写的不假思索的。

    class Solution {
        // max
        int m = Integer.MIN_VALUE;

        public int maxPathSum(TreeNode root) {
            recurtion(root);

            return m;
        }

        public int recurtion(TreeNode root) {
            // left sum
            int ls = 0;
            // right sum
            int rs = 0;
            if(root.left != null) ls = recurtion(root.left);
            if(root.right != null) rs = recurtion(root.right);

            // sum
            int r = root.val;
            int s = r + ls + rs;
            int sl = ls + r;
            int sr = rs + r;
            int mm = r;
            
            // 要返回一个最大的mm
            if(mm < sl) mm = sl;
            if(mm < sr) mm = sr;

            // 要注意,路径返回和求出连续路径最大值,要考虑本节点root + left + right
            if(m < s) m = s;
            if(m < sl) m = sl;
            if(m < sr) m = sr;
            if(m < r) m = r;

            return mm;
        }
    }

简化一下:

class Solution {
    // max
    int m = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        recurtion(root);

        return m;
    }

    public int recurtion(TreeNode root) {
        // left sum
        int ls = 0;
        // right sum
        int rs = 0;
        if(root.left != null) ls = recurtion(root.left);
        if(root.right != null) rs = recurtion(root.right);

        // sum
        int r = root.val;
        // 要返回一个最大的mm
        int mm = Math.max(ls + r,Math.max(rs + r, r));

        // 最大值
        m = Math.max(Math.max(m,mm),ls + rs + r);

        return mm;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值