124. 二叉树中的最大路径和
查看题目困难
树
二叉树
高频
解法一:recursive-dfs
时间复杂度:O(n) | 空间复杂度:O(n) | 推荐使用
动画演示
二叉树中的最大路径和 - 递归DFS
当前最大路径和: -9007199254740991
操作日志
代码实现
class Solution {
private int maxSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
maxGain(root);
return maxSum;
}
private int maxGain(TreeNode node) {
if (node == null) {
return 0;
}
// 递归计算左右子树的最大贡献值
// 只有当贡献值大于0时,才会选择该子树
int leftGain = Math.max(maxGain(node.left), 0);
int rightGain = Math.max(maxGain(node.right), 0);
// 计算当前节点的最大路径和
// 路径是:左子树 -> 当前节点 -> 右子树
int currentPathSum = node.val + leftGain + rightGain;
// 更新全局最大路径和
maxSum = Math.max(maxSum, currentPathSum);
// 返回当前节点对父节点的最大贡献值
// 只能选择左子树或右子树中的一条路径
return node.val + Math.max(leftGain, rightGain);
}
}
// 二叉树节点定义
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}时间复杂度:O(n)
空间复杂度:O(n)