题目链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum
1.题目描述:
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例1:
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例2:
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
2.题目解析:
2.1 理解什么是路径:路径就是 (从left直到left子树中某个节点(不一定是叶子节点)的一条链)+ 当前节点(可以是树中的任意一个节点)+(从right直到right子树中某个节点的一条链)
2.2 如何找到最大路径和:遍历所有的路径,维护一个全局变量maxres,每次都进行比较,将最大值赋值给maxres
2.3如何遍历所有的路径:DFS
3.代码(JAVA版本):
class Solution{
//maxres维护最大值
int maxres=Integer.MIN_VALUE;
public int maxPathSum(TreeNode root){
dfs(root);
return maxres;
}
public int dfs(int root){
//递归边界,如果是空节点,返回0
if(root==null)return 0;
//得到左子树从left到叶子节点的最大一条链的和,如果是负数,那么就不计入本节点的最大路径和
int lres=Math.max(dfs(root.left),0);
//得到右子树从right到叶子节点的最大一条链和,如果是负数,不计入本节点的最大路径和
int rres=Math.max(dfs(root.right),0);
//更新最大的路径和
maxres=Math.max(maxres,root.val+lres+rres);
//以本节点为根的路径一定要加上本节点
return root.val+Math.max(lres,rres);
}
}