题干
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
想法
树的题
写递归呗。
首先需要明白几点:
除了这条路径上最上边那个节点,没有节点是同时选用了自己的左右子节点的。
换句话说除了最上边的点,都只能左子树右子树选一个。
于是我把它称为贡献值:自己节点的值➕左右子树贡献值中大的那个。
对于一个给定的点而言,左右子树的贡献度只有是正数的时候才有意义。
于是代码很好写了
Java代码
package daily;
public class MaxPathSum {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
//MaxRes来存最大值
int MaxRes = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
count(root);
return MaxRes;
}
public int count(TreeNode root) {
//空就返回0
if (root == null) {
return 0;
}
//只要大于0的贡献值
int LeftCount = Math.max(0, count(root.left));
int RightCount = Math.max(0, count(root.right));
//更新最大值
MaxRes=Math.max(MaxRes,root.val+LeftCount+RightCount);
//更新贡献值 ,注意贡献值和最大值的区别,最大值是要取左右子树的,贡献值只用取大的那个
return root.val + Math.max(LeftCount, RightCount);
}
public static void main(String[] args) {
MaxPathSum maxPathSum = new MaxPathSum();
TreeNode root = new TreeNode(-10);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
System.out.println(maxPathSum.maxPathSum(root));
}
}