题目描述
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
样例
输入: [1,2,3]
1
/ \
2 3
输出: 6
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
算法分析
- 1、
dfs(root)
返回的是从该节点往下走的最大值 - 2、
l
表示的是从左节点往下走的最大值,r
表示从右节点往下走的最大值,经过该节点的路径的值共有4
个- 1、
max0 = root.val
- 2、
max1 = root.val + l
- 3、
max2 = root.val + r
- 4、
max3 = root.val + l + r
- 1、
- 3、算出上述
4
种情况的最大值即经过该节点的最大路径和,算出所有点的最大路径和取最大值即可
时间复杂度
Java 代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
static int ans ;
//算出该节点的最大值
static int dfs(TreeNode root)
{
int l = 0,r = 0;
if(root.left != null) l = dfs(root.left);
if(root.right != null) r = dfs(root.right);
int max0 = root.val;
int max1 = root.val + l;
int max2 = root.val + r;
int max3 = root.val + l + r;
int res = max0;
if(max1 > res) res = max1;
if(max2 > res) res = max2;
ans = Math.max(ans, Math.max(res, max3));
return res;
}
public int maxPathSum(TreeNode root) {
ans = -0x3f3f3f3f;
dfs(root);
return ans;
}
}