默写的话,记得这是一个后序遍历模板就行
核心就是这三行代码:
int left=dfs(root.left);
int right=dfs(root.right);
result=Math.max(result,left+right+root.val);
然后额外要记住的是返回的是:
return root.val+0 root.val+left root.val+right 三个数中最大的
左子树的最大路径和+右子树的最大路径和+root的值
后序遍历模板
dfs(root.left);
dfs(root,right);
root.val
dfs函数的功能:传入root结点,
找到root根节点+左子树的最大路径和,
root根节点+右子树的最大路径和
求出这两个数中较大的那个
return root.val+Math.max(0,Math.max(left,right));
核心代码:
int result=Integer.MIN_VALUE;
public int maxPathSum(TreeNode root)
{
dfs(root);
return result;
}
public int dfs(TreeNode root)
{
int left=Math.max(0,dfs(root.left));
int right=Math.max(0,dfs(root.right));
int temp=left+right+root.val;
result=Math.max(temp,result);
return root.val+Math.max(0,Math.max(left,right));
}
dfs的功能只是返回一边,而不是两边,最后返回的左边或者右边这条路径
在dfs内部求出temp=左边+右边+root
完整的代码:
class Solution
{
int result=Integer.MIN_VALUE;
public int maxPathSum(TreeNode root)
{
dfs(root);
return result;
}
public int dfs(TreeNode root)//
{
if(root==null)
{
return 0;
}
int left=Math.max(0,dfs(root.left));
int right=Math.max(0,dfs(root.right));
int temp=left+right+root.val;
result=Math.max(temp,result);
return root.val+Math.max(0,Math.max(left,right));
}
}