题目要求

Given a binary tree, find the maximum path sum.

For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.

For example:
Given the below binary tree,

       1
      / \
     2   3
Return 6.

题目要求:从二叉树中找到任意两个节点构成的一条路径,该路径上节点的和为最大。

思路与代码

在这里和其它题目不一样的是,并非从根节点到叶节点的一条路径,而是从任意一个节点到任意一个节点的路径。其实在这里我们通过递归的方法可以发现以下几种场景:

1.当前节点作为起始节点
2.当前节点不是起始节点

首先我们以当前节点作为根节点,找到可能构成的最大路径值。也就是

1.根节点本身(如果根节点的左右子树的最大值均<=0)
2.根节点加上左子树
3.根节点加上右子树

其次,如果当前节点不是起始或结束节点,那么当前节点就如例题中所示的2

在递归中,我们需要先计算当前节点可能生成的最大路径值并与最大值比较,同时还要返回给父节点该节点作为根节点的最大路径值。

代码如下:

    int max = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        maxPathSumRec(root);
        return max;
    }
    
    public int maxPathSumRec(TreeNode root){
        if(root==null) return 0;
        int left = maxPathSumRec(root.left);
        int right = maxPathSumRec(root.right);
        max = Math.max(Math.max(max, Math.max(left+root.val, right+root.val)), left+root.val+right);
        return Math.max(left+root.val, right+root.val);
    }
    
    public static void main(String[] args){
        BinaryTreeMaximumPathSum_124 b = new BinaryTreeMaximumPathSum_124();
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(3);
        t1.left = t2;
        t1.right = t3;
        b.maxPathSum(t1);
    }

clipboard.png
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~


raledong
2.7k 声望2k 粉丝

心怀远方,负重前行