给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxPathSum(TreeNode root) {
map.put(null, 0);
getMax(root);
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int res = Integer.MIN_VALUE;
while(!queue.isEmpty()) {
TreeNode poll = queue.poll();
TreeNode left = poll.left;
TreeNode right = poll.right;
if(left != null) queue.offer(left);
if(right != null) queue.offer(right);
res = Integer.max(res, (map.get(left) > 0 ? map.get(left) : 0) +(map.get(right) > 0 ? map.get(right) :0) +poll.val);
}
return res;
}
Map<TreeNode, Integer> map = new HashMap<>();
public int getMax(TreeNode root) { // 任意节点到叶子节点最大和
if(map.get(root) != null) return map.get(root);
if(root.left == null && root.right == null) {
map.put(root, root.val);
return root.val;
}
int leftTree;
if(map.get(root.left) != null) leftTree = map.get(root.left);
else {
leftTree = getMax(root.left);
map.put(root.left, leftTree);
}
int rightTree;
if(map.get(root.right) != null) rightTree = map.get(root.right);
else {
rightTree = getMax(root.right);
map.put(root.right, rightTree);
}
int maxTree = Integer.max(leftTree, rightTree);
int nowTree = root.val+(maxTree > 0 ? maxTree : 0);
map.put(root, nowTree);
return nowTree;
}
}