题目传送: https://leetcode.cn/problems/binary-tree-maximum-path-sum/
运行效率
解题思路:
首先我们要知道最大路径不可能是如下图那样出现多条线,然后相交的情况。
所以代码里面 的函数dfs()返回的是经过root的单边分支最大和。。 因为题目让我们求的是一条路径,那条路径肯定是一条线,这条线肯定是由1个单边或者2个单边相连接所组成的
代码如下:
int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if (root == null) {
return 0;
}
dfs(root);
return max;
}
/**
* 返回经过root的单边分支最大和, 即Math.max(root, root+left, root+right)
* @param root
* @return
*/
public int dfs(TreeNode root) {
if (root == null) {
return 0;
}
//计算左边分支最大值,左边分支如果为负数还不如不选择
int leftMax = Math.max(0, dfs(root.left));
//计算右边分支最大值,右边分支如果为负数还不如不选择
int rightMax = Math.max(0, dfs(root.right));
//left->root->right 作为路径与已经计算过历史最大值做比较
max = Math.max(max, root.val + leftMax + rightMax);
// 返回经过root的单边最大分支给当前root的父节点计算使用
//因为本函数的意义是 返回经过root的单边分支最大和。 所以下面的return 一定要包含root节点
return root.val + Math.max(leftMax, rightMax);
}