Leetcode124.二叉树中的最大路径和 Binary Tree Maximum Path Sum(Java)
##Tree##, ##Depth-first Search##, ##Recursion##
二叉树中的最大路径和
本题采用DFS后序遍历方法
- 递归遍历整棵树,递归时维护每个结点开始向下延伸的最大路径和
- 对于每个结点,都先递归计算完左右子树,将得到的左右子树的向下延伸的最大路径和与该结点值相加,就能够得到经过该结点的最大路径和
- 维护(返回)这个结点向下延伸的最大路径和,从左右子树路径中选择权值较大的一条路径延伸即可
- 当左右子树向下延伸的最大路径和小于
0
时,可不选择该路径,将小于0
的路径和记为0
时间复杂度: O(n)
后续遍历中,每个结点仅仅被计算一次
class Solution {
int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return max;
}
public int dfs(TreeNode root) {
if (root == null) return 0;
int lmax = Math.max(0, dfs(root.left));
int rmax = Math.max(0, dfs(root.right));
max = Math.max(root.val + lmax + rmax, max);
return Math.max(root.val + lmax, root.val + rmax);
}
}