题目
考查递归
我的思路
第一次20分钟做出一道困难题。。
private int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if (root == null) {
return 0;
}
dfs(root);
return max;
}
public int dfs(TreeNode root) {
if (root == null) {
return 0;
}
int left = dfs(root.left);
int right = dfs(root.right);
int cur;
//如果子节点值都小于0
if (left < 0 && right < 0) {
cur = root.val;
//如果都大于0,
} else if (left >= 0 && right >= 0) {
cur = root.val + left + right;
} else {
//否则选取个最大的
cur = root.val + Math.max(left, right);
}
max = Math.max(cur, max);
if(left < 0 && right < 0){
return root.val;
}
//这样返回是因为,父节点路径只能经过一个节点。
return root.val + Math.max(left, right);
}
官方答案
重点在于递归的返回值的判断,使得代码更加严谨,不得不说学到了
int maxSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
maxGain(root);
return maxSum;
}
public int maxGain(TreeNode node) {
if (node == null) {
return 0;
}
// 递归计算左右子节点的最大贡献值
// 只有在最大贡献值大于 0 时,才会选取对应子节点
int leftGain = Math.max(maxGain(node.left), 0);
int rightGain = Math.max(maxGain(node.right), 0);
// 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
int priceNewpath = node.val + leftGain + rightGain;
// 更新答案
maxSum = Math.max(maxSum, priceNewpath);
// 返回节点的最大贡献值
return node.val + Math.max(leftGain, rightGain);
}