解题思想:
首先确定通过后序遍历来遍历整个二叉树,因为对于每个中节点,它需要依赖左子树和右子树来判断接下来的路径。
其次,在每次递归返回时,应该从以下三种情况中选择值最大的返回给上一层
(1)选择当前节点与它的左子树路径之和
(2)选择当前节点与它的右子树路径之和
(3)选择当前节点
最后,定义一个全局变量记录结果, 每次递归时都需要暂存当前最大值。
注意:在暂存最大值时,除了以上三种情况,还需要额外比较:当前节点与左子树路径以及右子树路径之和(即三者之和)。为什么不在每次递归返回时,将这种情况参与比较返回,是因为题中要求,即“序列中每对相邻节点之间都存在一条边”。
class Solution {
int ans = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
int tem = dfs(root);
return ans;
}
//取两边加中之后 就不能再添加路径值了
//因为题中说序列中每对相邻节点之间都存在一条边
//计算两边加中 看是否最大 计算左和加中 右和加中 单个中 取三者最大往回返
public int dfs(TreeNode root){
if(root == null){
return 0;
}
int left = dfs(root.left);
int right = dfs(root.right);
int landmid = left + root.val;
int randmid = right + root.val;
int all = left + right + root.val;
ans = Math.max(ans, all);
ans = Math.max(ans, landmid);
ans = Math.max(ans, randmid);
ans = Math.max(ans, root.val);
if(landmid >= randmid && landmid >= root.val){
return landmid;
}
if(randmid >= landmid && randmid >= root.val){
return randmid;
}
// if(root.val >= landmid && root.val >= randmid){
// return root.val;
// }
return root.val;
}
}