Binary Tree Maximum Path Sum
23% Accepted
Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
Have you met this question in a real interview? Yes
Example
Given the below binary tree:
  1
 / \
2   3
return 6.
Tags Expand
- Divide and Conquer
- Dynamic Programming
- Recursion
思路
- 任意节点到任意节点
- 有可能不经过根节点,也有可能经过根节点,所以求其中最大值
- 分治的方法,分别求左边最大,右边最大, 再比较 左最大+右最大+根节点 是不是会刷新最大值,如果不能的话还是去原来的最大值
- max为全局变量
- 最终maxPathSum返回的是max,而helper只是在求每一条边上的最大值
- 解法来源Leecode
Lintcode
public class Solution {
    int max = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        helper(root);
        return max;
    }
    // helper returns the max branch
    // plus current node's value
    int helper(TreeNode root) {
        if (root == null) return 0;
        int left = Math.max(helper(root.left), 0);
        int right = Math.max(helper(root.right), 0);
        max = Math.max(max, root.val + left + right);
        return root.val + Math.max(left, right);
    }
}
Leetcode
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    int max = Integer.MIN_VALUE;;
    public int maxPathSum(TreeNode root) {
        if (root == null) {
            return 0;
        }
        maxSum(root);
        return max;
    }
    public int maxSum(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = maxSum(root.left);
        int right = maxSum(root.right);
        max = Math.max(max, (left > 0 ? left : 0) + (right > 0 ? right : 0 )+ root.val);
        return root.val + (Math.max(left, right) > 0 ? Math.max(left, right) : 0);
    }
}