leetcode:Binary Tree Maximum Path Sum

来源:互联网 发布:网络传销诈骗标语 编辑:程序博客网 时间:2024/06/11 21:39


求出二叉树中的最大路径和

假设节点A是二叉树中最大路径和经过的节点,而且是深度最小的节点,也就是如图

        A

      /    \

    L      R

因为已经知道上图A节点是最大路径和的经过节点,那么可以知道,节点A的L子树路径和必然是最大的,同理

可推R子树也是最大的;当且仅当L、R子树返回的是正数

对于L子树,如果返回的和是负数,那么节点A就无需考虑L子树的值,因为这样子会是和变小,同理可知R子树。


以上的假设是在A是在于最大路径和中,但是对于所有的节点node,他需要向他的父节点返回经过他的路径的最大

数值和,题目要求是单起点单终点的,所以当A返回时,它需要判断他返回是L+A,还是R+A、或A(L、R均为负)


/** * Definition for binary tree * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {     static int ans = Integer.MIN_VALUE;        public int maxPathSum(TreeNode root) {            ans = Integer.MIN_VALUE;            seek(root);            return ans;        }        int seek(TreeNode node){            if(node  == null){                return 0;            }            else{                int leftSum = seek(node.left);                int rightSum = seek(node.right);                if(leftSum >= 0){                    if(rightSum >= 0){                        ans = Math.max(ans, rightSum + leftSum + node.val);                        int maxOne = Math.max(rightSum, leftSum);                        return maxOne + node.val >= 0 ? maxOne + node.val: 0;                    }                }                else if(rightSum >= 0){                    ans = Math.max(ans, rightSum + node.val);                    return rightSum + node.val >= 0? rightSum + node.val : 0;                }                ans = Math.max(ans, node.val);                return node.val >= 0 ? node.val: 0;            }        }}




0 0
原创粉丝点击