2025年- H55-Lc163--124. 二叉树的最大路径和(深搜)--Java版
1.题目描述
2.思路
(1)至少要包含一个节点。所以就是以当前节点为根节点的左右孩子
(2)一个节点不能经过两次,子树(左右孩子)的和交给递归去做。
递归公式:sum=自己+左+右
递归返回结果:output=自己+max(左,右)
递归过程,找到maxsum=max(maxsum,sum)
3.代码实现
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}public class H124maxPathSum {int ans=Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {//1.将每个节点去进行递归dfs(root);return ans;}int dfs(TreeNode root){if(root==null){return 0;}int left=dfs(root.left);int right=dfs(root.right);
// 当前节点作为“顶点”,同时连接左子树和右子树时,路径和是多少?
//
// 然后更新全局最大路径和 ans。//更新“当前整棵树最大路径和”ans=Math.max(left+right+root.val,ans);//当前节点的左右子树选取最大的那个,如果右负数的我们直接置于0//dfans 其实是“当前节点能选择的左右子树中路径贡献最大的一边”。////因为不能从当前节点同时向左和右扩展(那样就不算是一条路径了),所以只能选一边。int dfans=Math.max(left,right);//选当前节点的左右子树选取最大的那个,然后再加上根节点return Math.max(dfans+ root.val,0);
// 当前节点能向上传递给父节点的最大路径贡献是多少?
//
// 如果左右都为负数,直接返回 0。
//
// 否则返回 当前节点值 + 左/右子树中较大的贡献。}
}