LeetCode 28 Binary Tree Maximum Path Sum

Given a binary tree, find the maximum path sum.

The path may start and end at any node in the tree.

For example:

Given the below binary tree,

  1
 / \
2   3

Return 6.

分析:

刚看到题,以为是图算法,找最大路径和。但考虑到树是有向图,没有办法直接从子节点遍历到父节点。

但对于任意一个节点,都可以计算以此节点开始(即此节点是路径的一端)往下遍历的最大路径和。

有了上面的认识,

对于某一个节点,我们就可以用 左孩子的路径,右孩子的路径 以及当前节点组合成任意两点间的路径(此路径经过当前节点)。

既然,任意两点的路径可以如此构造,那么任意两点间路径和也可以求出。

思路清晰了之后,

我么对树进行遍历,并求出经过每个节点的最大路径和,进行比较即可。

几个注意点

1,递归访问时,函数返回的应该是以当前节点开始往下的最大路径和;

2,Java中参数是值传递,所以max要是一个引用变量,最简单的就是数组咯,声明为只有一个元素的数组即可。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public int maxPathSum(TreeNode root) {
        //max用来记录最大路径和
        int[] max = new int[1];
        max[0] = Integer.MIN_VALUE;
        calSum(root, max);
        return max[0];
    }
    //此函数返回node开始往下的最大路径和
    public int calSum(TreeNode node, int[] max){
        if(node == null)
            return 0;
        
        int left = calSum(node.left, max);
        int right = calSum(node.right, max);
        //根据左右孩子的情况计算当前节点开始往下的最大路径和
        int current = Math.max(node.val, Math.max(node.val+left, node.val+right));
        //更新max
        max[0] = Math.max(max[0], Math.max(current, left+node.val+right));
        
        return current;
    }
}


你可能感兴趣的:(递归,树遍历)