解题思路
深度优先遍历,dfs(root)
返回值为以root
和其中一个子节点的路径和
但是求最终结果时,要用root.val
加两个子节点的路径和,代表root
连接了左右子节点的通路
因为题目是可以从子节点到父节点再到另一个子节点的
代码
class Solution {
int result = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return result;
}
private int dfs(TreeNode root) {
if (root == null) {
return 0;
}
// left是某一节点往上层到达root的左子节点的最大路径和
int left = Math.max(0, dfs(root.left));
// right是某一节点往上层到达root的右子节点的最大路径和
int right = Math.max(0, dfs(root.right));
// cur是以root为连接左右子节点的通路的最大路径和
int cur = root.val + left + right;
// 保留最大值
result = Math.max(result, cur);
// 返回值是root和其中一个子节点的路径和
return root.val + Math.max(left, right);
}
}