【DFS】LeetCode 124. 二叉树中的最大路径和
题目链接
思路
一个子树内部的最大路径和 = 左子树提供的最大路径和 + 根节点值 + 右子树提供的最大路径和。即 dfs(root.left)+root.val+dfs(root.right)
定义dfs函数:返回当前子树能向父节点“提供”的最大路径和。即,一条从父节点延伸下来的路径,能在当前子树中捞取的最大收益。分三种情况:
- 路径停在当前子树的根节点,在当前子树的最大收益:
root.val + 0
- 走左子树:
root.val + dfs(root.left)
- 走右子树:
root.val + dfs(root.right)
使用 Math.max(leftValue + root.val, rightValue + root.val)
来获取左右子树的贡献最大值,因为贡献有可能是负数,所以需要 return Math.max(max, 0)
代码
class Solution {
private int result = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return this.result;
}
private int dfs(TreeNode root){
if(root == null){
return 0;
}
int leftValue = dfs(root.left);
int rightValue = dfs(root.right);
result = Math.max(result, root.val + leftValue + rightValue);
// 计算当前分支对父结点的贡献
int max = Math.max(leftValue + root.val, rightValue + root.val);
// 如果贡献值为负数,则返回值为0,说明没有选择这个结点
return Math.max(max, 0);
}
}