import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型
思路:对于最大路径和:节点可能是负的,因此开始dfs的节点不一定是根节点,结束的节点也不一定是叶子结点
1.根
2.左+根 或者 右+根 (MAX(左子树最大路径和,右子树最大路径和)+根)
3.左+右+根 (找到左子树最大路径和 + 右子树最大路径和 + 根)
*/
private int maxs=Integer.MIN_VALUE; //记录路径最大和
public int maxPathSum (TreeNode root) {
if(root==null)
return 0;
getMax(root);
return maxs;
}
public int getMax(TreeNode root){
if(root==null){
return 0;
}
int leftMax = getMax(root.left); //左孩子的最大路径和
int rightMax = getMax(root.right);//右孩子的最大路径和
//1.根节点+左右孩子的最大路径和
int sum = root.val;
if(leftMax>0){
sum+=leftMax;
}
if(rightMax>0){
sum+=rightMax;
}
if(maxs<sum){
maxs=sum;
}
//2.在合法路径中,除了根节点的左右子树可同时包含,其余结点的左右子树只需保留一个。(通过这一行来更新maxs)
return Math.max(leftMax,rightMax)>0? (Math.max(leftMax,rightMax)+root.val):root.val;
}
}
leetcode----给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。 这个路径的开始节点和结束节点可以是二叉树中的任意节点
最新推荐文章于 2022-10-09 21:49:43 发布